有一个我的matlab运行的程序,因为有两个巨大的嵌套for循环,我们希望这个程序运行超过10个小时。我们要求matlab在每次循环时打印出循环编号。
最初(前1小时),我们在屏幕上看到循环数增量非常快;随着时间的推移,它变得越来越慢.....现在(超过20个小时执行相同的“.m”文件,它仍然没有完成),它几乎比它有20倍最初。
ram的使用率最初约为30%,现在执行20小时后,如下所示:
我的电脑规格如下。
如何让matlab保持最初的速度?
答案 0 :(得分:4)
一些一般提示,如果他们不帮助我建议将代码添加到问题中。
waitbar
答案 1 :(得分:4)
我只能猜测,但我的打赌是你有一些尚未预先分配的数组变量,因此它们的大小在for
循环的每次迭代时都会增加。因此,Matlab必须在每次迭代中重新分配内存。重新分配会降低速度,而会使这些变量越大,因为Matlab需要找到更大的连续内存块。这可以解释为什么程序似乎随着时间的推移而变慢。
如果这确实是原因,那么解决方案就是预先分配这些变量。如果事先不知道它们的大小,您可以进行猜测并预先分配到近似大小,从而避免至少部分重新分配。或者,如果您的程序不受内存限制,可能在预分配时可以在变量大小上使用上限;然后,在循环之后,通过删除未使用的条目来修剪数组。
答案 2 :(得分:0)
我想将每个人都指向MATLAB文档中的以下页面:Strategies for Efficient Use of Memory。该页面包含MATLAB用户应该了解的一系列技术和良好实践。
OP在提到内存使用量随时间推移而增加时提醒我。实际上,在 win32 系统中存在长时间运行的MATLAB实例存在问题,其中存在内存泄漏并且随着时间推移而加剧(这也在链接中描述)。
我想添加 Luis' 回答我的一位朋友在与Yair Altman的通信中收到的以下建议:
首先分配最大的vars 有助于为最高的vars分配最大的免费连续块,但很容易证明在某些情况下这实际上可能是有害的,因此它不是一般解决方案。
解决内存碎片的唯一可靠方法是重新启动Matlab,甚至更好地重启Windows。
有关内存分配性能的更多信息可以在以下未记录的Matlab帖子中找到: