12

标题说明了一切。

基本上,每次我错误地让 MATLAB 使用大量 RAM 进行具有许多我正在创建的参数的模拟时,我都厌倦了必须重置我的 comp。

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

我知道我在分配内存的每个地方都放置了 try/catch,但这是针对已经编写好的程序,而且,为了将来参考,我希望能够在开始时设置一个参数并完成它。

有办法吗?

谢谢!

4

2 回答 2

8

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

于 2013-01-03T18:12:24.617 回答
7

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

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

为了将来参考,在我的模拟中,我在我的预分配开始时有一个方法(子函数,如果你不想这样做,OOP),它计算给定模拟参数的估计总内存使用量(# of elements我将使用乘以 8 作为双精度的所有大型数组都是以字节为单位的内存),并且在使用太多 RAM 时会引发错误。

这是一个快速内存检查的示例。我知道我将分配 3 个 m×3×t 数组和 5 个 m×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
于 2013-01-03T17:52:16.790 回答