कभी-कभी मैं MATLAB स्क्रिप्ट शुरू करता हूं और बहुत देर से महसूस करता हूं कि यह बहुत अधिक आंकड़ों को आउटपुट करने जा रहा है। आखिरकार मैं एकबहुत सारे आंकड़े खोलते समय MATLAB क्रैश से कैसे बचें?
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
जो आसानी से मेरी मशीन का उपयोग कर पर पुनः प्रस्तुत किया जा सकता है
for i=1:inf
figure;
end
मैं करने के लिए मिल के आसपास 90 आंकड़े से पहले ही 128 एमबी जावा ढेर के मानक सेटिंग (Preferences/Java Heap Memory) के साथ दुर्घटनाओं, जबकि ढेर को दोगुना करने के लिए 256 एमबी मुझे लगभग 200 आंकड़े देता है।
क्या आप पर कोई भी तरीका देखते हैं जावा त्रुटि संदेश से बचें? यदि किसी अन्य आकृति के लिए पर्याप्त स्मृति नहीं है, तो मैं अपनी स्क्रिप्ट को को को दुर्घटना के बजाय बताया था।
शायद मुझे figure
के लिए एक रैपर हो सकता है जो (किसी भी तरह?) जांचता है कि जावा ढेर कितना उपलब्ध है और यदि पर्याप्त जगह नहीं है तो कोई नया आंकड़ा खोलने से इंकार कर देता है? का उपयोग कर
for i=1:inf
java.lang.Runtime.getRuntime.gc
fprintf('%3.0f: %1.0f Byte free\n',i,java.lang.Runtime.getRuntime.freeMemory);
figure;
end
मैं
यह उत्पादन किया गया था:
अद्यतन
नीचे दिए गए उत्तर का उपयोग करना, मैं कितना मुक्त मेमोरी जावा है के लिए एक अच्छी ग्राफ मिल मान लें कि शुरुआत में वृद्धि का मतलब है कि कचरा संग्रह केवल एक निश्चित प्रयास करता है बहुत समय मैं इसे बुलाता हूँ?
अद्यतन 2 - मेरी समाधान
मदद मैं यहाँ मिल गया का उपयोग करना, मैं एक figure.m
जो overloads और कॉल के रूप में निम्नलिखित समाधान लागू निर्माण में figure
आदेश:
function varargout=figure(varargin)
memcutoff = 10E6; % keep at least this amount of bytes free
memkeyboard= 3E6; % if memory drops below this, interrupt execution and go to keyboard mode
global refuse_new_figures
if refuse_new_figures
warning('jb:fig:lowjavamem2','Java WAS memory low -> refusing to create a new figure. To reset, type "global refuse_new_figures ; refuse_new_figures = [];"');
return
end
freemem=java.lang.Runtime.getRuntime.freeMemory;
if freemem < memcutoff
fprintf('Free memory is low (%1.0f Bytes) -> running garbace collector...\n',freemem);
java.lang.Runtime.getRuntime.gc
end
freemem=java.lang.Runtime.getRuntime.freeMemory;
% fprintf('Free memory is %1.0f Bytes.\n',freemem);
if freemem < memkeyboard
warning('jb:fig:lowjavamem','Java memory very low -> going into interactive mode. Good luck!');
keyboard;
end
if freemem < memcutoff
warning('jb:fig:lowjavamem','Java memory low -> refusing to create a new figure!');
refuse_new_figures=true;
else
if nargin > 0
if nargout > 0
varargout{1}=builtin('figure',varargin{:});
else
builtin('figure',varargin{:});
end
else
if nargout > 0
varargout{1}=builtin('figure');
else
builtin('figure');
end
end
end
अच्छा अद्यतन। अगर मैं कर सकता तो मैं इसे दूसरी बार वोट दूंगा। मुझे आश्चर्य है कि जावा की वजह से वृद्धि अधिक स्मृति आवंटित हो सकती है। – Jonas