Matlab Preallocation - PullRequest
       9

Matlab Preallocation

1 голос
/ 30 июля 2011

Я выполняю симуляцию уравнения диффузионной реакции в MATLAB и заранее выделяю память для всех моих векторов, однако, во время цикла, в котором я решаю систему уравнений, используя BICG, объем памяти, который использует MATLAB, увеличивается.

Например:

concentration = zeros(N, iterations);

for t = 1:iterations
   concentration(:,t+1) = bicg(matrix, concentration(:,t));
end

По мере выполнения программы объем памяти, который использует MATLAB, увеличивается, что, по-видимому, говорит о том, что матрица, концентрация, увеличивается в размере по мере продолжения программы, даже если я предварительно выделил пространство. Это потому, что элементы в матрице становятся двойными вместо нулей? Есть ли лучший способ предварительно выделить память для этой матрицы, чтобы вся память, необходимая программе, была предварительно выделена в начале? Мне было бы легче так, потому что тогда я бы с самого начала знал, сколько памяти потребуется программе, и будет ли симуляция сбивать компьютер или нет.

Спасибо за вашу помощь, ребята. Я немного искал и не нашел ответа, поэтому надеюсь, что не повторю вопрос.


EDIT:

Спасибо Amro и Stardt за вашу помощь, ребята. Я попытался запустить «память» в MATLAB, но интерпретатор сказал, что команда не поддерживается для моего типа системы. Я перезапустил симуляцию, хотя с «концентрацией чей» отображался каждые 10 итераций, а размер распределения матрицы не менялся со временем. Однако я заметил, что размер матрицы составляет около 1,5 ГБ. Даже при том, что это имело место, системный монитор только показывал MATLAB как использующий 300 МБ (но он постепенно увеличивался и достигал чуть более 1 ГБ к концу моделирования). Итак, я предполагаю, что MATLAB заранее распределяет память просто отлично и нет утечек памяти, но системный монитор не считает память как используемую, пока MATLAB не начнет записывать значения в нее в цикле. Я не знаю, почему это так, потому что я представляю, что запись нулей приводит к тому, что системный монитор видит эту память как «используемую», но я полагаю, что это не так.

В любом случае, я ценю вашу помощь с этим. Я бы проголосовал за оба ваших ответа, так как нашел их полезными, но у меня недостаточно репутационных баллов, чтобы сделать это. Спасибо, ребята!

Ответы [ 2 ]

5 голосов
/ 31 июля 2011

Я действительно сомневаюсь, что это утечка памяти, так как большинство «объектов» в MATLAB очищаются после того, как они выходят из области видимости.AFAIK, MATLAB не использует GC как таковой, но детерминистский подход к управлению памятью.

Поэтому я подозреваю, что проблема, скорее всего, вызвана фрагментацией памяти: когда MATLAB выделяет памятьдля матрицы она должна быть смежной.Таким образом, когда функция вызывается повторно, создавая и удаляя матрицы, и со временем фрагментация становится заметной проблемой ...

Одна вещь, которая может помочь вам в отладке, - использование недокументированного: profile on -memory, который будет отслеживатьраспределение в профилировщике MATLAB.Проверьте также инструмент мониторинга Джо Конти .Также на этой странице есть некоторая полезная информация.

1 голос
/ 31 июля 2011

Я предполагаю, что вы наблюдаете использование памяти в Matlab, например, в диспетчере задач в Windows.Использование памяти, вероятно, увеличивается из-за выполнения bicg () и переменных, которые не были собраны сборщиком мусора после его завершения.Память, выделенная для матрицы концентрации, остается прежней.Вы можете набрать

whos concentration

до и после цикла «for», чтобы увидеть, сколько памяти выделено для этой переменной.

...