Правильный способ ограничить использование памяти Mathematica? - PullRequest
21 голосов
/ 22 октября 2011

В 32-битной операционной системе, где максимальный объем памяти, выделяемый какой-либо одной программе, ограничен, Mathematica корректно завершает работу ядра и возвращает ошибку максимального выделения памяти.

Однако в 64-битной ОС Mathematicaбудет свободно использовать всю доступную память и остановить работу системы.Следовательно, как правильно ограничить использование памяти?Можно использовать MemoryConstrained в сочетании с $Pre или CellEvaluationFunction, но я бы не стал связывать ни одну из них для этой цели, или пришлось бы модифицировать существующие варианты использования для включения этой функции.

Есть ли другой способглобально ограничить использование памяти, например, флаг ядра или системный $ Option?

1 Ответ

14 голосов
/ 22 октября 2011

В Mathematica 8 вы можете запустить сторожевой таймер памяти, что-то вроде:

maxMemAllowed        = 15449604;
intervalBetweenTests = 1; (*seconds*)
iAmAliveSignal       = 0;
Dynamic[iAmAliveSignal]
RunScheduledTask[
       If[MemoryInUse[] > maxMemAllowed , Quit[], iAmAliveSignal++],      
       intervalBetweenTests];

Не забудьте запустить

RemoveScheduledTask[ScheduledTasks[]];

чтобы отключить его.

Редактировать

Вы можете предупредить или в интерактивном режиме решить, что делать, прежде чем выйти. Как и просили, вот пробная версия с 1,3 ГБ. Я не могу пойти намного дальше, чем в этой машине.

maxMemAllowed = 1.3 1024^3; (*1.3 GB*)
intervalBetweenTests = 1; (*Seconds*)
iAmAliveSignal = 0;
leyendToPrint = "";
Dynamic[leyendToPrint]
RunScheduledTask[
  If[MemoryInUse[] > maxMemAllowed, 
   CreateDialog[CancelButton["Max Mem Reached", DialogReturn[]]]; 
   Quit[],
   Print["Memory in use: ", MemoryInUse[]]; 
   leyendToPrint = 
    "Seconds elapsed = " <> ToString[iAmAliveSignal++]], 
  intervalBetweenTests];
IntegerPartitions[320, {15}];

enter image description here

...