एक मैट्रिक्स को बहुत बड़ी आवंटित मेमोरी में असाइन करके, मैटलैब किसी भी तरह से इसे 'कॉपी' करते समय डुप्लिकेट कर देगा, और यदि मैट्रिक्स को कॉपी किया जाना काफी बड़ा है, तो मेमोरी ओवरफ्लो होगी। यह नमूना कोड है:
main_mat=zeros(500,500,2000);
n=500;
slice_matrix=zeros(500,500,n);
for k=1:4
parfor i=1:n
slice_matrix(:,:,i)=gather(gpuArray(rand(500,500)));
end
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix; %This is where the memory will likely overflow
end
ओवरहेड slice_matrixके main_matबिना बस 'स्मैश' करने का कोई तरीका ? अग्रिम में धन्यवाद।
संपादित करें:
ओवरफ्लो तब हुआ जब main_matपहले से आवंटित है। यदि (छोटे आकार) के main_matसाथ आरंभ किया जाता है main_mat=zeros(500,500,1);, तो अतिप्रवाह नहीं होगा, लेकिन यह धीमा हो जाएगा क्योंकि मैट्रिक्स इसमें सौंपे जाने से पहले आवंटन नहीं किया जाता है। यह kवृद्धि की सीमा के रूप में प्रदर्शन को काफी कम कर देगा ।
memoryफ़ंक्शन का उपयोग कर रहे हैं ? कार्य-प्रबंधक? एक स्मृति त्रुटि Matlab से? यह किस लाइन के कोड में हो रहा है?
main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)वह जगह है जहां मेमोरी ओवरफ्लो समस्या होती है। यह सत्यापित है कि जब मैंने main_matपहले से आवंटित किया था , तो यह अतिप्रवाह होगा, अगर मैं नहीं करता, तो यह नहीं होगा। मतलूब 'स्मृति त्रुटि से बाहर' लौटेगा।
h=h+slice_matrix(end)पहले से main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix;(और 0 के साथ ज को इनिशियलाइज़) कर सकते हैं? मुझे संदेह है कि यह नई जोड़ी गई लाइन पहले से ही आपकी मेमोरी समस्याओं का कारण बनेगी।
parfor। इसके अतिरिक्त,parforआपके डेटा को प्रत्येक अलग-अलग कार्यकर्ता में कॉपी करता है, इस प्रकार 4 श्रमिकों का मानना है कि यह आपके डेटा को रैम में चार बार डुप्लिकेट करता है।