如何在不关闭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
中始终无法得到任何实际有用的东西。每当我的内存用完时,都不会有几个字节,所以这些技巧并没有真正的帮助。