Подтвердить что ты не робот

Правильный способ использования памяти Mathematica?

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

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

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

4b9b3361

Ответ 1

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

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

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

RemoveScheduledTask[ScheduledTasks[]];

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

Edit

Вы можете предупредить или в интерактивном режиме решить, что делать, прежде чем уйти. В соответствии с запросом, это пробная версия с 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