调试Matlab避免内存泄漏

调试Matlab避免内存泄漏,matlab,debugging,memory,memory-leaks,Matlab,Debugging,Memory,Memory Leaks,我有一个内存密集型Matlab脚本。 让我困惑的是,如果我运行这段代码,它将在第一次迭代时泄漏内存(超出预期的46次迭代)。泄漏最终将变得非常严重,需要迫使Matlab退出: 为了找到泄漏点,我在循环的第一行设置了一个断点,但当我点击“继续”时,执行就在第一个循环中运行,并在断点处再次停止,没有产生泄漏。移除断点并从该点继续将重新引入泄漏。 使用断点一次执行代码一个循环可以避免泄漏,代码终止时不会出现任何问题(图2) 现在,我想: 1) 了解此次泄漏是否是由于我介绍的原因,或者是否可能是Ma

我有一个内存密集型Matlab脚本。 让我困惑的是,如果我运行这段代码,它将在第一次迭代时泄漏内存(超出预期的46次迭代)。泄漏最终将变得非常严重,需要迫使Matlab退出:

为了找到泄漏点,我在循环的第一行设置了一个断点,但当我点击“继续”时,执行就在第一个循环中运行,并在断点处再次停止,没有产生泄漏。移除断点并从该点继续将重新引入泄漏。 使用断点一次执行代码一个循环可以避免泄漏,代码终止时不会出现任何问题(图2)

现在,我想:

1) 了解此次泄漏是否是由于我介绍的原因,或者是否可能是Matlab的特定问题

2) 了解如何查找泄漏(我无法使用调试器,因为它可以解决问题)


我很想提供代码,但它是一个相当大的块(>100行),所以我的问题更多的是关于一般方法,而不是具体问题的实际调试

谢谢你的建议。 我的方法是在每行代码上方隔离导致打印输出问题的代码部分,以便在发生泄漏崩溃之前,我可以看到执行停止的位置。 罪魁祸首是一个
zeros(100k)
行,我试图预先分配一个大矩阵

我尝试在较新版本的Matlab(2015b vs 2014b)上执行同一行,发现较旧版本允许实例化大矩阵(超过50k x 50k)并在占用所有内存时冻结,但较新版本返回以下错误:

使用零时出错

请求的50000x50000(18.6GB)阵列超过最大阵列大小首选项。创建大于此限制的数组可能需要很长时间,并导致MATLAB变得无响应。 有关详细信息,请参见阵列大小限制或首选项面板 信息

在我的情况下,NxN矩阵的限制为:

在16GB RAM上的Matlab2014b上大于60000

N>=46341在12GB RAM上的Matlab2015b上

不同的是,我2014年的版本让我至少可以尝试创建它们,当它们太大时就会崩溃,而2015年的版本让我根本无法尝试

令人费解的是,在2014b版本上,如果我调试代码,编译器会让
zero(100k)
行运行,一切正常。
如果我尝试在Matlab的变量选项卡中可视化矩阵的内容,问题再次出现。谢谢你的建议。 我的方法是在每行代码上方隔离导致打印输出问题的代码部分,以便在发生泄漏崩溃之前,我可以看到执行停止的位置。 罪魁祸首是一个
zeros(100k)
行,我试图预先分配一个大矩阵

我尝试在较新版本的Matlab(2015b vs 2014b)上执行同一行,发现较旧版本允许实例化大矩阵(超过50k x 50k)并在占用所有内存时冻结,但较新版本返回以下错误:

使用零时出错

请求的50000x50000(18.6GB)阵列超过最大阵列大小首选项。创建大于此限制的数组可能需要很长时间,并导致MATLAB变得无响应。 有关详细信息,请参见阵列大小限制或首选项面板 信息

在我的情况下,NxN矩阵的限制为:

在16GB RAM上的Matlab2014b上大于60000

N>=46341在12GB RAM上的Matlab2015b上

不同的是,我2014年的版本让我至少可以尝试创建它们,当它们太大时就会崩溃,而2015年的版本让我根本无法尝试

令人费解的是,在2014b版本上,如果我调试代码,编译器会让
zero(100k)
行运行,一切正常。
如果我尝试在Matlab中可视化矩阵的内容,问题再次出现。
变量选项卡

有趣的是,您是否在循环之前预先分配了矩阵?此外,循环中的任何内容是否会随着每次迭代而变大?i、 一个随着每次迭代而增大的向量?我没有一个真正的解决方案,但我只是想尝试一下。1) 使用
键盘
而不是调试器,也许您可以重现该行为。2) 写一个日志文件,其中包含使用的内存和相应的代码行。3) 在代码中的任意位置尝试
pack
。4) 将循环中的计算移动到每次迭代都会调用的函数中。我在osx上,因此无法使用内存,但感谢您的建议。我要试试whos,背包和键盘。此外,每个阶段的日志和外部功能都是很好的想法。我会在了解情况后尽快发布答案。谢谢像@Daniel的第四个建议一样,让我们知道会发生什么。内存使用的增长与内存泄漏并不相同。您是否使用可能导致此问题的任何外部二进制文件/mex文件?我认为不太可能有什么Matlab内置程序正在泄漏内存。如果您提供一些代码,将更容易帮助您。有趣的是,您是否在循环之前预先分配了矩阵?此外,循环中的任何内容是否会随着每次迭代而变大?i、 一个随着每次迭代而增大的向量?我没有一个真正的解决方案,但我只是想尝试一下。1) 使用
键盘
而不是调试器,也许您可以重现该行为。2) 写一个日志文件,其中包含使用的内存和相应的代码行。3) 在代码中的任意位置尝试
pack
。4) 将循环中的计算移动到每次迭代都会调用的函数中。我在osx上,因此无法使用内存,但感谢您的建议。我要试试whos,背包和键盘。此外,每个阶段的日志和外部功能都是很好的想法。我会把答案贴出来