एक मैट्रिक्स को बहुत बड़ी आवंटित मेमोरी में असाइन करके, मैटलैब किसी भी तरह से इसे 'कॉपी' करते समय डुप्लिकेट कर देगा, और यदि मैट्रिक्स को कॉपी किया जाना काफी बड़ा है, तो मेमोरी ओवरफ्लो होगी। यह नमूना कोड है:
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 श्रमिकों का मानना है कि यह आपके डेटा को रैम में चार बार डुप्लिकेट करता है।