如何在Unix上访问Matlab中的内存信息-相当于user view.maxPossibleAryBytes
我正在寻找在unix上的windows平台上,在matlab中由内存返回的等效数据 我知道使用unix(“vm_stat”)的可能性,但我需要的信息的具体部分是最大的连续可用内存块 此信息由内存返回,如下所示:如何在Unix上访问Matlab中的内存信息-相当于user view.maxPossibleAryBytes,matlab,unix,memory,Matlab,Unix,Memory,我正在寻找在unix上的windows平台上,在matlab中由内存返回的等效数据 我知道使用unix(“vm_stat”)的可能性,但我需要的信息的具体部分是最大的连续可用内存块 此信息由内存返回,如下所示: [userview, ~] = memory; a = userview.MaxPossibleArrayBytes 有人不知道如何编写可以返回相同信息的unix命令吗?调用命令“free”并解析结果。这在linux上工作 [r,w] = unix('free | grep Mem')
[userview, ~] = memory;
a = userview.MaxPossibleArrayBytes
有人不知道如何编写可以返回相同信息的unix命令吗?调用命令“free”并解析结果。这在linux上工作
[r,w] = unix('free | grep Mem');
stats = str2double(regexp(w, '[0-9]*', 'match'));
memsize = stats(1)/1e6;
freemem = (stats(3)+stats(end))/1e6;
输出以GB为单位。自由返回的最后一个数字是操作系统使用的“缓存”内存,例如动态库。通常可以使用它,但您可以决定不使用它,只使用自由报告中的“free”——输出中的第三个数字字段
编辑在Linux上,MATLABs mxMalloc/mxCalloc中的内存分配很可能只是调用malloc和friends。要得到这种情况的提示,请进行以下实验。在mex文件中,使用以下代码分配数组,并将其返回到MATLAB:
rout = calloc(sizeof(Double),M*N);
pargout[0] = mxCreateNumericMatrix(0,0,mxDOUBLE_CLASS,mxREAL);
mxSetM(pargout[0], m);
mxSetN(pargout[0], n);
mxSetData(pargout[0], rout);
mexMakeMemoryPersistent(rout);
通常可以使用MATLAB中返回的变量。您甚至可以清除它-这不会导致任何问题。如果MATLAB真的只是使用malloc,那么我所知道的没有任何方法可以强制使用物理上连续的内存
我知道你不能在Windows上运行上面的代码。这段代码崩溃了。当然,您不应该在代码中这样做。这仅仅说明了这一点。谢谢-不过有几个问题-第一个问题是osx上不提供免费服务。不过,还有其他方法可以获得这些信息。但是-看起来您正在匹配可用的总内存,我想要的是可用的最大连续块?我认为从用户的角度来看,物理连续内存块在OSX上没有任何意义。我知道MATLAB声称他们使用连续内存来存储阵列,但对于虚拟内存操作系统,分配的内存总是“虚拟”连续的。只有在特殊情况下才需要物理连续内存(内核代码、设备映射内存)。我真的不认为MATLAB有任何方法来执行物理上连续的分配。此外,我几乎可以肯定他们只是使用malloc和friends。查看编辑后的注释,找到一段代码,说明我为什么这么认为。我环顾四周,找到了。这个家伙反复尝试分配内存,如果他失败了,就会减少数组的大小。我强烈建议您不要做这样的事情:)取决于配置,但最终您可能会交换很多,而不是获得OOM..太好了。谢谢你的时间-我现在被出卖了!我的代码涉及读取一个非常大的文件,因此我将只在mem-free上工作,而不必担心在这个平台上的连续分配。不管怎么说,它似乎起作用了。BW史蒂文(注:我将投票赞成你的答案,一旦我得到15名)