check parameter used by function with large memory
2 次查看(过去 30 天)
显示 更早的评论
Hi:
I ran my code and found that after a certain time the memory is occupied by nearly 50G. I want to find the parameters which used so much memory but there are lots of sub-functions.
is there anyway to find the corresponding parameters, sub-functions, and memory used? so that I can optimize my code?
Thanks! Yu
3 个评论
Jan
2018-7-30
How do you determine the amount of "occupied" memory? Maybe all you see is the reserved memory, which does not necessarily mean, that it is in use.
Beside the parsed source code, functions do not "use" any memory at all, except if you store persistent memory. Only data occupy memory.
Without seeing the code, it is impossible to suggest an improvement.
采纳的回答
OCDER
2018-7-30
编辑:OCDER
2018-8-1
REAL NEW ANSWER
You are generating a ton of invisible figure handles, and clearing the variable name without closing the figures. This will accumulate a ton of figure handles that are not referred to by any variable name (hence whos fail to detect these. Use close and not clear.
for j = 1:10
f = figure('visible', 'off');
clear f %Clears the variable, but not the handle! Use "close(f)"!
end
findobj(0, '-class', 'matlab.ui.Figure') %You have tons of figures, hidden.
close all %closes all your figures
findobj(0, '-class', 'matlab.ui.Figure') %All the figures are deleted now.
NEW ANSWER
Use the undocumented memory profiler as shown here: http://undocumentedmatlab.com/blog/undocumented-profiler-options
To summarize, do this in you matlab command window:
profile -memory on
setpref('profiler', 'showJitLines', 1);
profview
%In profview, on the top next to "Run this code:", type in the command to run your code.
OLD ANSWER
Use whos to determine the variable names and size in the for loop. Then print out the largest var and its size. Here's an example.
for j = 1:100 %Your large for loop
... blah blah blah
if mod(j, 10) == 0 %just so you don't print too many times
W = whos;
[MaxByte, MaxIdx] = max([W.bytes]);
fprintf('Largest Var = %s [%0.3f GB]\n', W(MaxIdx(1)).name, MaxByte/1e9);
end
end
3 个评论
OCDER
2018-7-31
Interesting... just found a undocumented memory profiler. See edited New Answer above.
更多回答(2 个)
Jan
2018-7-31
Remember, that the RAM shown in the TaskManager is not necessarily "occupied". If Matlab reserves 100MB frequently in a loop, the released memory is not necessarily given back to the operating system. And if it is, the OS might not find the time currently to overwrite it with zeros, such that it can be delivered to an application again. This means, that the TaskManager does not tell you, how much RAM the code needs. The code might run with 1GB RAM also fluently, although the memory managers of Matlab and the OS reserve more memory, when it is available.
8 个评论
Guillaume
2018-8-1
编辑:Guillaume
2018-8-1
I used figure ('visible','off') in my loop, but I have clear the invisible figure at end of each loop
f = figure;
clear f
No you haven't! There's a huge difference between clear and close. clear f gets rid of the variable f but the figure it points to still exist. close(f) closes the figure pointed to by f but keep f as a variable (which is now an invalid figure handle).
So it's no wonder you're low on memory, you've got all these figures open. Replace the
clear f
by
close(f);
In general, you should never use clear. clearing a variable that is created in a loop in particular serves no purpose. close on the other hand is useful.
0 个评论
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Debugging and Analysis 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!