Ответ 1
Вы можете установить квоту виртуальной памяти для группы процессов. В Windows используйте объект Job. На * nix используйте ulimit
. Это работает с любым процессом, а не только с MatLab.
См
Название говорит все.
В принципе, я устаю от reset моего comp каждый раз, когда я ошибочно делаю MATLAB для использования большого количества ОЗУ для моделирования с множеством параметров, которые я создаю.
Есть ли способ сделать это остановкой/ошибкой, если использование ОЗУ начнет превышать определенный процент от моей общей ОЗУ?
Я знаю, что я помещаю try/catch каждый раз, когда я выделяю память, но это для уже написанной программы, а также для будущей ссылки я хочу иметь возможность просто установить параметр в начале и с этим нужно покончить.
Есть ли способ?
Спасибо!
Вы можете установить квоту виртуальной памяти для группы процессов. В Windows используйте объект Job. На * nix используйте ulimit
. Это работает с любым процессом, а не только с MatLab.
См
Проблема, которую вы видите, возникает, когда 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