Возникшую у меня проблему можно воспроизвести, запустив приведенный ниже код.
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}
для представления блоков строк одного и того же массива. Это не может быть оптимальным.
О, хорошо, я предположил, что он поместил его на диск где-то в стороне, в одном из своих собственных каталогов. Поэтому мне нужно где-то хранить каждый из моих высоких массивов на диске, и тогда память будет свободной :)
Да, это должно сработать так, как вы ожидаете. Вы можете, конечно, программно сохранять большие массивы на диск, очищая память по ходу дела, а затем загружать их вместе как высокий массив.
Как бы я это сделал? Я понимаю, что могу использовать save или write для хранения массивов на диск, но как тогда мне загрузить их все как единый массив?



Как упоминалось в комментариях, конструктор локального массива tall (где вы даете ему локальные данные, а не datastore) обычно используется только для прототипирования в памяти, прежде чем вы укажете свои массивы tall на ваши реальные большие данные в datastore.
Вы можете использовать tall/write для записи ваших высоких массивов на диск, а затем сделать чтение datastore из мест, которые вы использовали в write. Это обработает данные, не загружая их сразу в память.
Из документы: Высокие массивы позволяют работать с данными, хранящимися в хранилище данных.. В память загружаются только части массива, если остальная часть массива хранится на диске в другом месте. В противном случае память - единственное место, где вы определили эти массивы, как еще MATLAB может удерживать то, что содержит массив?