我的代码是:
function eigs_mem_test
N = 20000;
density = 0.2;
numOfModes = 250;
A = sprand(N, N, density);
profile -memory on
eigs(A, numOfModes, 0.0)
profile off
profsave(profile('info'), 'eigs_test')
profview
end
然后返回
即。它说MATLAB分配了18014398508117708.00 Kb或1.8e10 Gb - 完全不可能。这怎么发生的?代码以正确的输出完成,在htop中我可以看到内存使用量变化很大,但保持在16G以下。
对于N = 2000,我得到明智的结果(即分配0.2G。)
如果我想获得用于大型稀疏矩阵的内存上限,我如何有效地分析这种情况呢?
我使用MATLAB R2017a。
答案 0 :(得分:1)
我无法在R2017b中重现您的问题,我的机器上有128GB的RAM。以下是运行示例代码后的结果:
值得注意的是,该功能达到峰值14726148Kb,或约1.8GB。我对MATLAB在这里使用的单位感到困惑,因为我在任务管理器中看到了更接近14GB的使用率,这与你观察到的大量使用量(以及GB的1.4e7KB)相匹配,我只能认为探测器是用来表示KB的状态。 (千字节)而不是Kb(千位)。
像这样的大量意外值通常是溢出的结果,所以这可能是内部溢出错误。
您可以使用whos
来获取变量
w = whos('A'); % get details of variable A
sizeOnDisk = w.bytes; % get size on disk
这并不一定会告诉您示例中使用的eigs
函数有多少内存。您可以在函数中轮询memory
以获取当前使用情况。
我会拒绝进一步探讨这个问题,因为如何分析内存使用情况的问题有already been asked and answered。
N.B。我不确定为什么我的机器比你的机器慢100倍,我认为你的内存使用的图像不是来自实际运行你的示例代码?或者我的RAM很糟糕......