我正在MATLAB中运行扩散反应方程的模拟,我事先为所有向量预先分配了内存,但是,在循环期间,我使用BICG解决了一个方程组, MATLAB使用的内存量正在增加。
例如:
concentration = zeros(N, iterations);
for t = 1:iterations
concentration(:,t+1) = bicg(matrix, concentration(:,t));
end
随着程序的运行,MATLAB使用的内存量增加,这似乎表明矩阵,浓度随着程序的继续而增加,即使我预先分配了空间。这是因为矩阵中的元素变成了双精度而不是零吗?是否有更好的方法为此矩阵预分配内存,以便程序所需的所有内存将在开始时预先分配?这样对我来说会更容易,因为那时我会从一开始就知道程序需要多少内存,以及模拟是否会使计算机崩溃。
感谢您的帮助,伙计们。我做了一些搜索并没有找到答案,所以我希望我不会重复一个问题。
编辑:
感谢Amro和stardt帮助你们。我尝试在MATLAB中运行'memory',但是解释器说我的系统类型不支持命令。我重新运行模拟,但每10次迭代显示'whos concentration',矩阵的分配大小不随时间变化。但是,我注意到矩阵的大小约为1.5 GB。尽管如此,系统监视器只显示MATLAB使用300 MB(但在模拟结束时它稳定增加到1 GB以上)。所以我猜测MATLAB预先分配了内存并且没有内存泄漏,但是系统监视器不计算内存,因为MATLAB开始在循环中向它写入值。我不知道为什么会这样,正如我想象的那样,写零会触发系统监视器将内存视为“正在使用”,但我猜这不是这种情况。
无论如何,感谢您对此的帮助。我会将你的两个答案都投票,因为我发现它们都有帮助,但我没有足够的声誉点来做到这一点。谢谢你们!
答案 0 :(得分:5)
我真的怀疑这是一个内存泄漏,因为MATLAB中的大多数“对象”一旦超出范围就会自行清理。 AFAIK,MATLAB does not use a GC本身,但是管理记忆的确定性方法。
因此我怀疑问题更可能是由内存碎片造成的:当MATLAB为矩阵分配内存时,它必须是连续的。因此,当重复调用函数,创建和删除矩阵时,随着时间的推移,碎片成为一个明显的问题......
可能有助于您调试的一件事是使用未记录的profile on -memory
,它将跟踪MATLAB探查器中的分配。查看monitoring tool by Joe Conti。此page也有一些有用的信息。
答案 1 :(得分:1)
我假设您正在观看matlab的内存使用情况,例如Windows上的任务管理器。由于执行了bicg()和在结束后没有被垃圾收集的变量,内存使用量可能会增加。分配给浓度矩阵的存储器保持不变。您可以输入
whos concentration
在“for”循环之前和之后查看为该变量分配了多少内存。