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

如何在不关闭matlab的情况下清除虚拟内存?,matlab,memory,Matlab,Memory,我正在进行活动识别,但在处理一个视频后出现内存不足错误 最大可能阵列从444mb变为84mb,这意味着它不能处理多个视频。使用清除所有和全部关闭我们可以只清除matlab内存,但如何在不关闭matlab的情况下清除虚拟内存(ram)空间 任何帮助都将不胜感激。似乎效果相当不错。但是,如果您在得到“Java堆空间”类型的错误后尝试调用它,它可能会有帮助,也可能没有帮助,我还没有完全弄清楚是否存在一种模式 编辑:还可以尝试 pack 指挥部。这迫使Matlab在自己的内存上运行垃圾收集器,而Jav

我正在进行活动识别,但在处理一个视频后出现
内存不足错误

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

任何帮助都将不胜感激。

似乎效果相当不错。但是,如果您在得到“Java堆空间”类型的错误后尝试调用它,它可能会有帮助,也可能没有帮助,我还没有完全弄清楚是否存在一种模式

编辑:还可以尝试

pack
指挥部。这迫使Matlab在自己的内存上运行垃圾收集器,而Java堆清理器也在Java内存上运行垃圾收集器

编辑2:我发现运行JVM垃圾收集器不需要下载Java堆清理器。您还可以选择:

java.lang.Runtime.getRuntime.gc;

这对我来说似乎很管用。

如果你必须同时完成所有这些任务,可能内存不足。但是,我假设您希望按顺序处理它们。 如中所述,您可能需要关闭matlab并重新启动它

这听起来可能很难,但只要稍加努力,你就能减轻痛苦

以下是您可以采取的步骤:

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

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

    如果运行时不是您的问题,您可以尝试使用
    matfile
    ,它将允许您访问/加载/保存硬盘上的数据,而不是RAM上的数据,但正如您所预期的,该过程可能会很慢

    我在解决问题时尝试的另一个选择是将数据转换为
    单一精度
    ,这将使内存消耗减少一半。对于视频和图像,我相信大部分工作都可以使用
    单精度
    而不是
    双精度
    来完成。当然,如果可以,那么在
    uint8
    中进一步使用它们将减少8的消耗


    关于您最初的问题,我认为除了每次重新启动matlab之外,实际上没有其他解决方案

    32位操作系统还是64位操作系统?在前一种情况下,您可以做的不多。32位windows xp matlab 2012a的可能重复。如果我们重新启动matlab,虚拟内存将被清除,但我不能这样做,因为我必须一次处理20多个视频来创建模板。我不知道你想做什么,但你是否将整个视频作为数组加载到matlab中?如果是这样的话,可能有更好的方法来处理视频,一帧一帧地加载。matlab对“pack”的帮助表明它应该可以工作。不幸的是,事实并非如此。@Ufos我发现这取决于具体情况,但它确实有效。密切关注Matlab的内存使用情况,当我调用
    pack
    时,我可以看到它在减少。
    java.lang.Runtime.getRuntime.gc也一样。后者只有在UI变得迟钝时才真正有用。您可以在前后使用
    java.lang.Runtime.getRuntime.freeMemory
    查看差异。@Roberto。问题是他们没有提到它应该只在windows上工作。而且,不管matlab声称什么,它只是对内存进行碎片整理,没有别的。p、 也不涉及gui,我在控制台模式下使用它,带有一个外部编辑器。@Ufos,这很有趣。我现在无法重现这一点,所以我可能是错的,但我几乎可以肯定,在某些情况下,
    clear
    并没有减少所使用的内存,但在
    clear
    之后调用
    pack
    确实减少了内存。我会让你知道,如果我设法让一个例子工作。注意,在某些情况下,这里的关键字是。而且,我从
    pack
    中始终无法得到任何实际有用的东西。每当我的内存用完时,都不会有几个字节,所以这些技巧并没有真正的帮助。