Как увеличить блокировку массива и устранить ошибку нехватки памяти в Matlab 2009b? - PullRequest
4 голосов
/ 30 апреля 2010

Я использую Matlab 2009b и у меня ошибка нехватки памяти. Я прочитал другие опубликованные Sol, но они не являются полезными для меня. Я уверен, что я все делаю правильно, но я должен использовать очень большое количество размеров массивов. Я думаю, что проблема заключается не в том, что Matlab не позволяет массиву находиться более чем в одном блоке ОС. Я использую Windows 7 . Есть ли способ избавиться от этой проблемы? Например, можно ли увеличить блок массива, который Matlab использует в Windows 7?

Система: Windows 7
Matlab: 2009b

Ответы [ 3 ]

3 голосов
/ 30 апреля 2010

Если вы считаете, что размеры вашего массива недостаточно велики, чтобы оправдать такую ​​ошибку, возможно, ваши предыдущие операции фрагментировали доступную память. MATLAB требует смежных блоков, поэтому фрагментация может привести к таким ошибкам.

Поэтому, прежде чем в вашем коде возникнет ошибка нехватки памяти, попробуйте выполнить команду pack. Это все, что я могу придумать, кроме обычных исправлений.

3 голосов
/ 30 апреля 2010

Если самый большой доступный блок (как показано memory) намного меньше, чем максимальный объем памяти, доступный для Matlab, перезапуск Matlab (или системы) может помочь.

В противном случае вам нужно либо переписать свой код, либо купить больше оперативной памяти (и / или использовать 64-разрядную версию Win7).

Я предлагаю вам попробовать переписать свой код. Очень часто можно обойти проблемы с памятью.

EDIT

Из вашего комментария к записи @Richie Cotton я вижу, что вы хотите провести классификацию огромного количества данных. Если имеется небольшое количество классов, ни один из которых не является очень разреженным, вы можете решить эту проблему, запустив kmeans, скажем, на 10 случайно выбранных подмножествах, скажем, 30% ваших данных каждый. Это должно найти вам центры кластеров просто отлично. Чтобы связать ваши данные с ядрами, все, что вам нужно сделать, - это рассчитать для каждой точки данных расстояние до центров кластера и связать их с ближайшим центром.

2 голосов
/ 30 апреля 2010

РЕДАКТИРОВАТЬ: MathWorks дать совет по этой проблеме .


Вы можете просмотреть использование памяти с помощью команд system_dependent memstats и system_dependent dumpmem (а также просто memory, как отметил Джонас).

Команда pack (которая фактически дефрагментирует ваше рабочее пространство) также может пригодиться.

Если вы имеете дело с объектами, содержащими> 10 миллионов или около того значений, то память может легко стать проблемой. Бросить аппаратное обеспечение в проблему (то есть купить больше оперативной памяти) может быть вариантом, но есть предел тому, чего вы можете достичь.

Я предлагаю вам подходить к перекодированию вещей, чтобы сделать их более эффективными по памяти:

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

function x = XPlus1(x)
x = x + 1;
end

более эффективно использует память, чем

function y = XPlus1(x)
y = x + 1;
end

Далее попробуйте разбить вашу проблему на маленькие кусочки. На простейшем уровне это может включать выполнение операции над строками вместо всей матрицы или над отдельными элементами вместо вектора. (Стоимость зацикливания меньше, чем стоимость того, чтобы он вообще не работал из-за ограничений памяти.) Затем вы должны восстановить свой ответ по частям.

Этот шаг, по сути, является философией beh map-Reduce, так что в качестве бонуса ваш код будет легче распараллеливаться.

...