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

Немедленно остановите MATLAB, если объем использования ОЗУ превышает указанную сумму. Есть ли способ?

Название говорит все.

В принципе, я устаю от reset моего comp каждый раз, когда я ошибочно делаю MATLAB для использования большого количества ОЗУ для моделирования с множеством параметров, которые я создаю.

Есть ли способ сделать это остановкой/ошибкой, если использование ОЗУ начнет превышать определенный процент от моей общей ОЗУ?

Я знаю, что я помещаю try/catch каждый раз, когда я выделяю память, но это для уже написанной программы, а также для будущей ссылки я хочу иметь возможность просто установить параметр в начале и с этим нужно покончить.

Есть ли способ?

Спасибо!

4b9b3361

Ответ 1

Вы можете установить квоту виртуальной памяти для группы процессов. В Windows используйте объект Job. На * nix используйте ulimit. Это работает с любым процессом, а не только с MatLab.

См

Ответ 2

Проблема, которую вы видите, возникает, когда Matlab начинает использовать виртуальную память. Обычно вы можете убить процесс Matlab через диспетчер задач, но это не всегда желательно. К сожалению, нет простого встроенного коммутатора Matlab, который, к сожалению, ограничит максимальный размер массива в глобальном масштабе.

Что вы можете сделать, так это сделать размер файла подкачки очень малым, так что Matlab не может много писать для него, но это, в свою очередь, может повлиять на производительность других программ. Другие решения, не относящиеся к Matlab, - это переход на Linux (где вы можете более легко установить ограничения памяти для программы, см. @BenVoigt answer for details on установление ограничений как для Windows, так и для Linux) или запустить все на виртуальной машине.

В будущем в моих симуляциях у меня есть метод (подфункция, если вы не хотите делать это ООП) в начале моего предварительного выделения, которое вычисляет расчетное общее использование памяти с учетом параметров моделирования (# элементов всех больших массивов я буду использовать раз 8 для удвоений - это память в байтах), и это вызывает ошибку при использовании слишком большого количества ОЗУ.

Здесь приведен пример быстрой проверки памяти. Я знаю, что я собираюсь выделить 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