如何在不关闭matlab的情况下清除虚拟内存?

时间:2013-09-04 11:07:26

标签: matlab memory

我正在处理活动识别,但在处理完一个视频后我得到out of memory error

最大可能阵列从444mb变为84mb,这意味着它无法处理多个视频。使用clear all;close all;我们可以清除matlab内存,但是如何在不关闭matlab的情况下清除虚拟内存(ram)空间?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

如果你必须同时做所有这些,可能没有足够的内存。但是我假设你想按顺序处理它们。 如this question中所述,您可能不得不求助于关闭matlab并重新启动它。

这可能听起来很糟糕,但只要做一点工作就可以减轻痛苦。

您可以采取以下步骤:

  1. 确保您的进度以方便的方式写在磁盘上,例如带有仍需要处理的数字列表的.mat文件。
  2. 编写包装函数。这个功能应该只是:
    • 打开列表
    • 确保列表中的下一个项目得到处理
    • 如果列表中还剩下一些内容,请打开一个调用此函数的新matlab会话,并关闭现有会话
  3. 最后一部分可能不容易找到,但假设您要调用的函数是magic(5),那么它将是这样的:

    !matlab -r "magic(5)" &
    exit
    

答案 1 :(得分:0)

如果运行时不是您的问题,您可以尝试使用matfile来访问/加载/保存硬盘上的数据而不是RAM,但正如您所期望的那样,可能会很慢。

我在处理我的问题时尝试的另一个选项是将我的数据转换为single精度,这应该会减少一半的内存消耗。对于视频和图片,我相信使用single代替double精度可以完成大部分工作。当然,如果可以,那么在uint8中进一步使用它们会使消耗减少8。

与您的原始问题相关,我认为除了每次重启matlab之外,实际上没有解决方案。

答案 2 :(得分:-1)

Java Heap Cleaner似乎运作得相当好。但是如果你在得到“Java堆空间”类型的错误后尝试调用它,它可能会有所帮助,也可能没有帮助,我还没弄清楚是否存在模式。

修改:同时尝试

pack

命令。这迫使Matlab在自己的内存上运行垃圾收集器,而Java Heap Cleaner在Java内存上执行相同的操作。

编辑2 :我发现您不需要下载Java Heap Cleaner来运行JVM垃圾收集器。你也可以去:

java.lang.Runtime.getRuntime.gc;

这对我来说似乎很有效。