У меня есть большой файл MATLAB (150 МБ) в матричной форме (то есть 4070x4070). Мне нужно работать над этим файлом в MATLAB, но я не могу загрузить этот файл. Я получаю ошибку «из памяти». Есть ли другой способ загрузить этот размер файла? Я использую 32-битный процессор и имею 2 ГБ оперативной памяти. Пожалуйста, помогите мне, я устаю от решения этой проблемы.Как загрузить большие файлы (~ 150 МБ) в MATLAB?
ответ
Если это файл изображения, и вы хотите работать с ним, попробуйте matlab block processing. Используя его, вы загрузите небольшие части файла. Ваша функция fun
будет применяться к каждому блоку индивидуально.
B = blockproc(src_filename,[M N],fun)
В случае это xml
файла, попробуйте режим XML DOM Node
вместе с SAX
- (Спасибо @Nzbuu за указание, что выход), но это, как представляется, не имеющие документы функциональности.
Кроме того, если это текстовый файл любого типа (маловероятно, из-за объема данных), попробуйте внешний инструмент для разделения.
XML DOM сначала считывает весь файл в память, так что это вам не поможет; SAX передает XML-данные и создает события для обработки данных. Кроме того, я обнаружил, что обработка объектов DOM в MATLAB происходит медленно. – Nzbuu
@Nzbuu, спасибо. По какой-то причине я считаю, что Matlab всегда использует SAX. Быстрый поиск в Google показал, что вы правы. –
Я думаю, что он использует SAX для создания дерева DOM. – Nzbuu
Starting от выпуска R2011b (ver.7.13) есть новый объект matlab.io.MatFile с MATFILE в качестве конструктора. Он позволяет загружать и сохранять части переменных в MAT-файлах. Дополнительную информацию см. В документации. Вот простой пример, чтобы прочитать часть матрицы:
matObj = matfile(filename);
a = matObj.a(100:500, 200:600);
Если исходный файл не является MAT-файл, но некоторые текстовый файл, вы можете прочитать его частично и использовать matfile
для сохранения этих частей к одной и той же переменной в файле MAT для последующего доступа. Не забудьте установить для свойства Writable
значение true в конструкторе.
Предположим, что ваш текстовый файл с разделителями табуляции и содержит только цифры, здесь приведен пример сценария для чтения данных с помощью блоков и сохранить их в файл MAT:
blocksize = 100;
startrow = 0;
filename = 'test.mat';
matObj = matfile(filename,'Writable',true);
while true
try
a = dlmread(filename,'\t',startrow,0); %# depends on your file format
startrow = startrow + blocksize;
matObj.a(startrow+(1:blocksize),:) = a;
catch
break
end
end
Я не последний релиз теперь проверить, но надеюсь, что это сработает.
Вы можете также пользователь от Matlab Memory-Mapping of Data Files читать в блоке файла, процесс, и перейти к следующему блоку без необходимости загружать весь файл в память сразу.
Например, см. this example, который «отображает в память файл из 100 чисел с плавающей запятой с двойной точностью».
Я пробовал этот объект в более раннем выпуске, когда он появился только в MATLAB. Интересно, что MATLAB все равно должен был загрузить весь файл в память. Я связался с поддержкой Mathworks, и они подтвердили это.Они в основном продвинули эту функцию в качестве возможности совместного использования данных между различными приложениями одновременно. Ну, похоже, что все изменилось. Я попробовал это снова с R2011a, а объект 'memmapfile' занимает только 300b. Хороший ответ. +1. Файл должен иметь регулярную структуру для этого объекта (только двоичный?), Поэтому входной файл, вероятно, придется переформатировать в любом случае. – yuk
Это формат файла * .mat или какой-либо другой формат? – hatboyzero
Я очень удивлен, что файл размером 150 МБ может заполнить 2 ГБ памяти при открытии! Насколько свободна память вашей машины до того, как вы попытаетесь загрузить нагрузку? Есть ли другие программы, которые вы могли бы закрыть? – japreiss
Если это файл .mat, то 'whos -file' также вызывает проблемы или просто «загружает»? Если это не файл .mat, есть ли текст заголовка? –