如何在Mac OSX上检查Matlab 2010b或更高版本中的可用内存?

hpy*_*hpy 4 memory macos matlab memory-management

我从2004年获得了Matlab的副本(忘记版本号是什么,但它确实很旧),我可以使用"features memstat"命令来查看Matlab可用的内存量.在Matlab 2010b中,该命令不再适用于我,我该怎么做才能看到可用的内存?谢谢.

PS我按照@Rasman的建议尝试了"内存"命令,但出现了以下错误:

??? 使用==>内存时出错在此平台上无法使用MEMORY功能.

我正在为Mac OS X 64位运行Matlab 2010b.

Ram*_*nka 13

unix('vm_stat');在Mac上使用MATLAB.这给出了例如:

Mach Virtual Memory Statistics: (page size of 4096 bytes)
Pages free:                        1580152.
Pages active:                       184679.
Pages inactive:                      64572.
Pages speculative:                   63389.
Pages wired down:                   203816.
"Translation faults":              3906655.
Pages copy-on-write:                301846.
Pages zero filled:                 1899205.
Pages reactivated:                       0.
Pageins:                            107102.
Pageouts:                                0.
Object cache: 15 hits of 32166 lookups (0% hit rate)
Run Code Online (Sandbox Code Playgroud)

结果是4096字节的页面,因此将结果乘以4096并获得与活动监视器一致的值(您必须将'speculative'添加到'free'以获得完全一致).如果您只想要可用内存,可以使用unix('vm_stat | grep free');.如果你想要一个数字,你可以使用类似的东西:

[s,m]=unix('vm_stat | grep free');
spaces=strfind(m,' ');
str2num(m(spaces(end):end))*4096
Run Code Online (Sandbox Code Playgroud)

编辑:回应下面的评论"它没有告诉你MATLAB用了多少以及MATLAB可以使用多少." 以下是我为这个附加问题所做的工作.

根据我的经验,64位MATLAB可以耗尽所有可用内存(如果你开始交换的话,它可以减速很多).我的一个系统有22Gb,使用所有这些都没有问题.如果您使用32位MATLAB,则限制为2Gb.

要查看总内存,您可以将(免费)+'有效'+无效'+'推测'+'有线'加起来vm_stat(并乘以4096).或者,如果您只想要总内存,则可以使用unix('sysctl hw.memsize | cut -d: -f2')(以字节为单位).

为了获得MATLAB使用的内存,稍微复杂一些.控制进程使用内存.如果您只是使用unix('ps'),您将获得使用的内存matlab_helper.所以我使用:

% get the parent process id
[s,ppid] = unix(['ps -p $PPID -l | ' awkCol('PPID') ]); 
% get memory used by the parent process (resident set size)
[s,thisused] = unix(['ps -O rss -p ' strtrim(ppid) ' | awk ''NR>1 {print$2}'' ']); 
% rss is in kB, convert to bytes 
thisused = str2double(thisused)*1024 
Run Code Online (Sandbox Code Playgroud)

上面我使用了一个小awk函数来选择一个命名列:

function theStr = awkCol(colname)
theStr  = ['awk ''{ if(NR==1) for(i=1;i<=NF;i++) { if($i~/' colname '/) { colnum=i;break} } else print $colnum }'' '];
Run Code Online (Sandbox Code Playgroud)

这个unix命令的一个小教程来解释上面的内容,万一它可以帮助任何人.unix('command')它自己显示输出并返回状态.如果要处理输出,请使用[s,w] = unix('command')并处理字符串输出w.如果你想忽略s输出,在MATLAB的后续版本,您可以使用[~,w] = unix('command'),但我尽量避免,因为我不可避免地在不同的计算机不同的版本.