如果RAM使用率超过指定的量,立即停止MATLAB.有办法吗?

Spa*_*cey 12 error-handling ram matlab memory-management

标题说明了一切.

基本上,每当我错误地让MATLAB使用大量的RAM进行模拟时,我就厌倦了重置我的comp,我正在创建许多参数.

如果RAM使用量开始超过我总RAM的指定百分比,有没有办法让它停止/错误?

我知道我在每次分配内存时都会尝试/捕获,但这是针对已编写的程序,并且为了将来参考,我希望能够在开始时设置一个参数并完成它.

有办法吗?

谢谢!

Ben*_*igt 8

您可以为进程组设置虚拟内存配额.在Windows上使用Job对象.在*nix上使用ulimit.这适用于任何过程,而不仅仅是MatLab.

看到

  • @Jonas:它适用于您添加到作业对象的任何进程.它在可执行文件上不是持久的,如果这就是你的意思,但是你总是可以编写(或下载;我确定有人已经写过这样的东西)一个小启动器来配置一个作业对象并启动一个MatLab实例在那份工作里面. (2认同)

Jon*_*nas 7

当Matlab开始使用虚拟内存时,您会看到问题.您通常应该能够通过任务管理器终止Matlab进程,但这并不总是可取的.不幸的是,没有简单的Matlab内部开关可以全局限制最大阵列大小.

你可以做的是使交换文件的大小非常小,这样Matlab就不能真正写很多东西,但这可能反过来影响其他程序的性能.其他非Matlab解决方案是切换到Linux(您可以更轻松地为程序设置内存限制,请参阅@ BenVoigt的答案,了解有关在Windows和Linux设置限制的详细信息),或运行虚拟机中的所有内容.

为了将来参考,在我的模拟中,我有一个方法(子函数,如果你不想这样做OOP)在我的预分配开始时计算给定模拟参数的估计总内存使用量(元素数量)我将使用的所有大型数组8用于双精度存储器(以字节为单位),并且当使用太多RAM时会抛出错误.

这是快速内存检查的示例.我知道我将分配3 m-by-3-by-t阵列和5 m-by-t阵列,所有这些都是双倍的.

maxMemFrac = 0.8; %# I want to use at most 80% of the available memory

numElements = 3 * (m * 3 * t) + 5 * (m * t);
numBytesNeeded = numElements * 8; %# I use double

%# read available memory
[~,memStats] = memory;

if numBytesNeeded > memStats.PhysicalMemory.Available * maxMemFrac
   error('MYSIM:OUTOFMEMORY','too much memory would be needed')
end
Run Code Online (Sandbox Code Playgroud)