为什么在运行需要很长时间执行的程序时,matlab运行得越来越慢?

时间:2014-12-27 17:38:32

标签: performance matlab slowdown

有一个我的matlab运行的程序,因为有两个巨大的嵌套for循环,我们希望这个程序运行超过10个小时。我们要求matlab在每次循环时打印出循环编号。

最初(前1小时),我们在屏幕上看到循环数增量非常快;随着时间的推移,它变得越来越慢.....现在(超过20个小时执行相同的“.m”文件,它仍然没有完成),它几乎比它有20倍最初。

ram的使用率最初约为30%,现在执行20小时后,如下所示:enter image description here


我的电脑规格如下。 enter image description here

如何让matlab保持最初的速度?

3 个答案:

答案 0 :(得分:4)

一些一般提示,如果他们不帮助我建议将代码添加到问题中。

  1. 不要打印到控制台,此输出会降低执行速度,输出会保留在内存中。如果需要,请编写日志文件。要获得简单状态,请使用waitbar
  2. 确认您正在预分配所有变量
  3. 检查哪些函数调用取决于循环索引,例如增加变量大小。
  4. 如果使用任何mex函数,请仔细检查它们是否存在内存泄漏。执行此操作的标准过程:使用随机示例数据调用函数,不要存储输出。如果内存使用量增加,则函数中存在内存泄漏。
  5. 使用分析器。分析前n次迭代的代码(其中n匹配大约10分钟),生成HTML报告。然后让它运行大约2个小时,并再次生成n次迭代的报告。现在比较两个报告,看看时间丢失的地方。

答案 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帖子中找到: