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

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

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

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


person Mr.Wizard    schedule 21.10.2011    source источник
comment
Хорошая операционная система должна быть в состоянии представить пользовательской программе управляемое представление своих ресурсов, включая ЦП и память.   -  person Dr. belisarius    schedule 22.10.2011
comment
@belisarius, говори прямо, чувак, что ты говоришь? ;-) Есть ли возможность установить максимальную оперативную память под Windows 7? Конечно, это предполагает, что Windows хороша...   -  person Mr.Wizard    schedule 22.10.2011
comment
Я говорил о хороших операционных системах ;) ... Нет, правда, я не знаю о Win7   -  person Dr. belisarius    schedule 22.10.2011
comment
@belisarius Я боялся этого. Пользователи Unix всегда смеются над тем, чего не делает Windows. Я не могу вспомнить, какую ОС вы используете?   -  person Mr.Wizard    schedule 22.10.2011
comment
OS X также позволяет mma остановить его, и, насколько я помню, когда я его использовал, Linux тоже (хотя с тех пор все могло измениться). Итак, хороший вопрос.   -  person acl    schedule 22.10.2011
comment
@belisarius Думаю, я не забыл; Не думаю, что я знал это. акк, интересно, спасибо.   -  person Mr.Wizard    schedule 22.10.2011
comment
@Мистер. Думаю, это можно сделать с помощью этого но не без боли   -  person Dr. belisarius    schedule 22.10.2011
comment
@belisarius ваше предложение приветствуется, но я ищу метод Mathematica. В противном случае я бы написал в SuperUser, спрашивая, как ограничить использование памяти общим приложением.   -  person Mr.Wizard    schedule 22.10.2011
comment
@Мистер. Не следует заставлять программу вести себя так. Операционная система предоставляет вам виртуальную среду, так что вы на самом деле не знаете, что такое реальность. Например, ОС может сжимать (подобно zip) ваши страницы памяти без вашего ведома и подтверждения, и ваше предполагаемое использование памяти может быть отключено в миллионы раз. Я видел некоторых зверей, которые реализовывали подобные вещи, но обычно это не очень хорошая идея.   -  person Dr. belisarius    schedule 22.10.2011
comment
@belisarius Я не уверен, что вы имеете в виду. Вы предлагаете, чтобы в Mathematica не было самоограничения? В таком случае он уже есть, MemoryConstrained, но я ищу другой способ применить его. Если вы говорите, что операционная система не должна устанавливать жестких ограничений для программы, я не понимаю; Я бы предпочел, чтобы ОС сказала, что MathKernel использует слишком много оперативной памяти и была завершена. Прощай, чем запирать всю систему. Я понимаю, что истинное использование ОЗУ во многих случаях не будет таким же, как расчетное использование ОЗУ, но я могу с этим согласиться.   -  person Mr.Wizard    schedule 22.10.2011
comment
@Мистер. Я говорю о том, что память (реальная или виртуальная), которую программа думает использует, может отличаться от того, что на самом деле ей назначает ОС. Ограничением должна управлять ОС, а не программа. Что касается MemoryConstrained, я считаю, что команда Mma пытается компенсировать недостатки ОС.   -  person Dr. belisarius    schedule 22.10.2011
comment
Это напоминает мне старую Mac OS (без «X»), где вам иногда приходилось вручную увеличивать объем памяти, которую программа могла использовать. Лично я бы использовал подход $Pre.   -  person Brett Champion    schedule 22.10.2011
comment
@Brett Установка ограничений памяти для процессов является серьезной проблемой для разработчиков ОС publib.boulder.ibm.com/infocenter/zos/v1r12/ — Кстати, как прошла конференция?   -  person Dr. belisarius    schedule 22.10.2011
comment
Конференция прошла хорошо; удалось лично встретиться со Шёрдом и Леонидом, к сожалению, в основном мимоходом. И они запланировали мои выступления (или моих товарищей по команде) на то же время, что и другие выступления, которые мне бы очень хотелось увидеть.   -  person Brett Champion    schedule 22.10.2011
comment
@Бретт, я бы хотел пойти. Возможно в следующий раз!   -  person Dr. belisarius    schedule 22.10.2011
comment
@Мистер. Вероятно, можно использовать идею Велизария из внутри Mathematica с помощью NETLink.   -  person Alexey Popkov    schedule 22.10.2011
comment
@Мистер. Wizard Я опубликовал свою попытку решить эту проблему здесь (функция, которую я назвал totalMemoryConstrained) здесь: stackoverflow.com/questions/6405304/ . У меня сложилось впечатление, что это не всегда решает проблему. Посмотрите, может ли это сработать для вас.   -  person Leonid Shifrin    schedule 22.10.2011
comment
@Алексей, у меня почти нет опыта работы с MathLink/NETLink. Не могли бы вы хотя бы дать несколько советов по реализации этого в ответе ниже? Леонид, спасибо, я прочитаю этот вопрос/ответ позже и проголосую соответственно. :-)   -  person Mr.Wizard    schedule 22.10.2011
comment
@Мистер. У меня нет большого опыта работы с .NET, поэтому я не могу сказать, как вызывать функции Job. Но я могу отослать вас к основной странице NETLink документации: Установка приоритета процесса ядра. Вы увидите, что манипулировать приоритетом процесса ядра очень просто. И также легко получить информацию о текущем использовании памяти ядром. Таким образом, можно написать простую программу мониторинга, которая будет проверять, сколько памяти в данный момент использует этот процесс. Но, наверное, идея с Job объектами намного лучше.   -  person Alexey Popkov    schedule 22.10.2011
comment
@Мистер. Вас также может заинтересовать мой ответ: Как безопасно убить подчиненное ядро?   -  person Alexey Popkov    schedule 22.10.2011
comment
@Мистер. В качестве альтернативы вас также может заинтересовать моя неопубликованная функция, реализующая FreeMemoryConstrained функциональность. Но он действительно очень сложный и на данный момент работает полностью корректно только с версией 7. Я не могу опубликовать его как ответ, потому что он огромен. Но я могу привести несколько фрагментов кода, демонстрирующих основные идеи. Обратите внимание, что для этого требуется запустить два процесса MathKernel: (1) главный, который отслеживает текущее использование памяти (2) подчиненный процесс, в котором выполняются все целевые вычисления.   -  person Alexey Popkov    schedule 22.10.2011
comment
@Alexey Возможно можно было бы использовать только одно ядро ​​и RunScheduledTask   -  person Dr. belisarius    schedule 22.10.2011


Ответы (1)


В 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}];

введите здесь описание изображения

person Dr. belisarius    schedule 22.10.2011
comment
Редактирование подтверждено. Если мы сможем получить подтверждение, что это работает в других операционных системах, я приму ответ. Еще раз спасибо. - person Mr.Wizard; 23.10.2011
comment
@belisarius +1 Интересная идея. Можно ли расширить эту функцию для перезапуска ядра с тем же или новым кодом, если предыдущий сеанс не был новым сеансом MathKernel? - person Alexey Popkov; 23.10.2011
comment
@Алексей, я действительно не знаю :( - person Dr. belisarius; 23.10.2011
comment
@belisarius Я создал отдельный вопрос по этому поводу: Самостоятельный перезапуск MathKernel - возможно ли это в Mathematica? - person Alexey Popkov; 23.10.2011
comment
смешно, что сама программа не имеет возможности ограничить использование памяти. 11 версия и все та же проблема. - person LowFieldTheory; 22.08.2019