Matlab: ваше мнение о небольшой проблеме с памятью при работе с матрицей

У меня есть небольшой вопрос относительно потребления памяти MATLAB.

Моя архитектура:

- Linux OpenSuse 12.3 64-разрядная
- 16 ГБ ОЗУ
- Matlab 2013a 64-разрядная

Я обрабатываю матрицу double размером: 62 x 11969100 (называется y)

Когда я пытаюсь сделать следующее:

a = bsxfun(@minus,y,-1)

или просто

a = minus(y, -1)

Я получил ошибку OUT of MEMORY (в обоих случаях).

Я только что подсчитал объем оперативной памяти, выделенный для матрицы:
62 x 11969100 x 8 = 5,53 ГБ.

Где я не прав?!

Большое спасибо!


person Mettbe    schedule 16.05.2013    source источник
comment
что выводит команда memory? возможно, у вас недостаточно непрерывной памяти для матрицы результатов a   -  person Shai    schedule 16.05.2013
comment
Привет, Шай, я работаю на Linux-машине, поэтому команда memory, к сожалению, не работает.   -  person Mettbe    schedule 16.05.2013
comment
Какие? Я не знаком с этой проблемой ... Ввод >> memory в командном окне Matlab не дает вам никакого вывода?   -  person Shai    schedule 16.05.2013
comment
См. документ для memory   -  person Shai    schedule 16.05.2013
comment
Ленивые @$#%^rs на Matlab...   -  person Shai    schedule 16.05.2013
comment
Если вы не слишком придирчивы к точности, попробуйте заменить double переменных на single - получите множитель x2 на память...   -  person Shai    schedule 16.05.2013
comment
На самом деле, современное определение МБ составляет 1e6 байт, а МБ определяется как 1024*1024 (одинаково для всех множителей). Следовательно, 62*11969100*8/1e9 = 5.94 GB.   -  person Rody Oldenhuis    schedule 16.05.2013
comment
@DennisJaheruddin: Что именно вы имеете в виду?   -  person Mettbe    schedule 16.05.2013
comment
Шай: Да, для некоторых приложений это нормально, но для некоторых других мне нужна точность 8 бит. удобно?!   -  person Mettbe    schedule 16.05.2013
comment
@user2389160: Посмотрите здесь.   -  person Rody Oldenhuis    schedule 16.05.2013
comment
@RodyOldenhuis Лучшее объяснение КОГДА-ЛИБО   -  person Ander Biguri    schedule 16.05.2013


Ответы (3)


У меня Win64, оперативка 16гб.

Начиная со свежего MATLAB, когда открыто всего несколько других несущественных приложений, мое базовое использование памяти составляет около 3,8 ГБ. Когда я создаю y, это увеличивается до 9,3 ГБ (9,3-3,8 = 5,5 ГБ, примерно то, что вы подсчитали). Когда я затем запускаю a = minus(y, -1), у меня не заканчивается память, но она увеличивается примерно до 14,4 ГБ.

Вам не потребуется много дополнительной памяти (максимум 1,6 ГБ), чтобы вызвать ошибку нехватки памяти.

Кроме того, когда MATLAB сохраняет массив, для этого требуется непрерывный блок памяти. Если ваша память была немного фрагментирована — возможно, у вас была пара других крошечных переменных, которые хранились прямо в середине одного из этих 5,5-гигабайтных блоков — вы также получили бы ошибку нехватки памяти (иногда вы можете избежать этой проблемы). с использованием pack).

person Sam Roberts    schedule 16.05.2013

Вывод memory на платформе Windows:

>> memory
Maximum possible array:            2046 MB (2.145e+009 bytes) *
Memory available for all arrays:   3226 MB (3.382e+009 bytes) **
Memory used by MATLAB:              598 MB (6.272e+008 bytes)
Physical Memory (RAM):             3561 MB (3.734e+009 bytes)

*  Limited by contiguous virtual address space available.
** Limited by virtual address space available.

Вывод computer на linux/mac:

>> [~,maxSize] = computer
maxSize =
     2.814749767106550e+14    % Max. number of elements in a single array

с некоторыми хаками (найдено здесь):

>> java.lang.Runtime.getRuntime.maxMemory
ans =
    188416000  

>> java.lang.Runtime.getRuntime.totalMemory
ans =
    65011712

>> java.lang.Runtime.getRuntime.freeMemory
ans =
    57532968

Как видите, помимо ограничений памяти для каждой переменной, существуют также ограничения на общий объем памяти для всех переменных. Это не отличается для Windows или Linux.

Важно отметить, что, например, на моей машине с Windows невозможно создать две переменные по 1,7 ГБ, даже если у меня достаточно оперативной памяти, и ни одна из них не ограничена максимальным размером переменной.

Поскольку выполнение операции minus присвоит результат равного размера новой переменной (a в вашем случае или ans, если ничего не присваивается), должно быть как минимум две этих огромных вещей. в памяти.

Я предполагаю, что вы столкнулись со вторым пределом общего объема памяти, доступного для всех переменных.

person Rody Oldenhuis    schedule 16.05.2013

bsxfun векторизован для повышения эффективности. Обычно векторизованные решения требуют больше, чем просто минимальный объем памяти.

Вы можете попробовать использовать repmat или, если это не сработает, простой цикл for.

В общем, я считаю, что цикл for потребует наименьшего количества памяти.

person Dennis Jaheruddin    schedule 16.05.2013
comment
Спасибо за ответ но все равно не убедил, матрица меньше 6 гб а у меня на машине 16 гб. - person Mettbe; 16.05.2013