在调试模式下,我停在某个断点处并进行一些矩阵操作以测试程序。这些操作计算量很大,因此MATLAB使用我的linux系统上的交换空间。然后,在继续运行程序之后,交换空间几乎已满,因此MATLAB会崩溃。有没有办法在调试节点上清理掉掉交换?执行clear all
和clear classes
仅对RAM内存有效,但不影响交换。
答案 0 :(得分:1)
你不能。交换并不特别,所以只需要解决这个问题,就像常规的内存不足一样。如果你释放内存,你可以间接释放用于支持它的交换(或者避免使用交换来补充它)。
交换空间只是虚拟内存的操作系统管理的后备存储。从正常程序的角度来看,交换是 RAM(只是慢速RAM),你不需要单独管理它。 (嗯......你可以"连接"页面以防止它们被换出等等,或者使用OS API来直接操作交换,但这些是低级平台特定的细节,(例如,低于malloc
),而不是作为Matlab M代码程序员向你展示,而不是你想在这里做什么。)如果你的Matlab程序内存不足,这意味着它用完了或者碎片化其进程的虚拟内存,而不是特别关于交换空间的内容。 (除非某处有一个低级错误。)
当发生这种情况时,您可能需要查看Matlab程序中的其他位置(例如,在全局变量,图形句柄属性或函数调用堆栈的其他级别)以查找尚未清除的其他数据,或者只是重新启动Matlab进程来修复内存碎片(如果你的代码用大量小数组填满内存,就会发生这种情况)。
就像@siliconwafer建议的那样,memory
,whos
和feature memstats
是调试它的好工具。如果您在调试器中停止,请意识到在dbquit
出现之前,您无法清除所有内容。
在调试器中执行大型矩阵操作不一定是可恢复的操作:如果您修改了在您正在处理的堆栈帧中的局部变量中保存的数组,但仍有副本它们保存在其他变量或框架中,Matlab的写时复制机制需要保留在阵列的两个副本上,如果达到RAM限制,那么对于该程序的运行可能会运气不好。
如果退出调试器后clear all
和clear classes
没有为你恢复足够的内存,那就像是内存碎片或C级内存泄漏(就像在MEX文件中一样)。在任何一种情况下,您都需要重新启动Matlab来解决它。避免使用大型cellstr
数组或其他小型数组来减少碎片。如果您正在使用任何自定义MEX功能,请仔细查看您的C代码。
或者你可能没有足够的记忆来完成你正在进行的操作。