Высокие массивы и память Matlab

Возникшую у меня проблему можно воспроизвести, запустив приведенный ниже код.

gcp;
C = {};
for i=1:1000
    C = [C,{tall(ones(1000,1,1000,2))}];
    pause(0.05)
end

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

gcp;
C = {};
for i=1:1000
    C = [C,{ones(1000,1,1000,2)}];
    pause(0.05)
end

То есть использование высоких массивов, похоже, вообще не влияет на использование памяти.

Если я хочу хранить большие массивы данных, созданных MatLab, вне памяти, как мне это сделать? Использование высоких массивов, похоже, не работает.

Примечание. Я использую MatLab 2017a, который не поддерживает вертикальную конкатенацию высоких массивов. Поэтому я использую структуру

{rows1,rows2,...,rowsn}

для представления блоков строк одного и того же массива. Это не может быть оптимальным.

Из документы: Высокие массивы позволяют работать с данными, хранящимися в хранилище данных.. В память загружаются только части массива, если остальная часть массива хранится на диске в другом месте. В противном случае память - единственное место, где вы определили эти массивы, как еще MATLAB может удерживать то, что содержит массив?

Wolfie 11.06.2018 15:40

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

Eddy 11.06.2018 15:45

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

Wolfie 11.06.2018 16:21

Как бы я это сделал? Я понимаю, что могу использовать save или write для хранения массивов на диск, но как тогда мне загрузить их все как единый массив?

Eddy 11.06.2018 16:46

См. datastore и gather. Обычно вы создаете datastore, затем создаете из него массив tall, выполняете (или, скорее, определяете) операции с ним, а затем вызываете gather для фактического выполнения вычислений.

Luis Mendo 11.06.2018 17:04
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
5
325
1

Ответы 1

Как упоминалось в комментариях, конструктор локального массива tall (где вы даете ему локальные данные, а не datastore) обычно используется только для прототипирования в памяти, прежде чем вы укажете свои массивы tall на ваши реальные большие данные в datastore.

Вы можете использовать tall/write для записи ваших высоких массивов на диск, а затем сделать чтение datastore из мест, которые вы использовали в write. Это обработает данные, не загружая их сразу в память.

Другие вопросы по теме