2012-02-03 1 views
9

У меня есть большой файл MATLAB (150 МБ) в матричной форме (то есть 4070x4070). Мне нужно работать над этим файлом в MATLAB, но я не могу загрузить этот файл. Я получаю ошибку «из памяти». Есть ли другой способ загрузить этот размер файла? Я использую 32-битный процессор и имею 2 ГБ оперативной памяти. Пожалуйста, помогите мне, я устаю от решения этой проблемы.Как загрузить большие файлы (~ 150 МБ) в MATLAB?

+4

Это формат файла * .mat или какой-либо другой формат? – hatboyzero

+1

Я очень удивлен, что файл размером 150 МБ может заполнить 2 ГБ памяти при открытии! Насколько свободна память вашей машины до того, как вы попытаетесь загрузить нагрузку? Есть ли другие программы, которые вы могли бы закрыть? – japreiss

+0

Если это файл .mat, то 'whos -file ' также вызывает проблемы или просто «загружает»? Если это не файл .mat, есть ли текст заголовка? –

ответ

3

Если это файл изображения, и вы хотите работать с ним, попробуйте matlab block processing. Используя его, вы загрузите небольшие части файла. Ваша функция fun будет применяться к каждому блоку индивидуально.

B = blockproc(src_filename,[M N],fun) 

В случае это xml файла, попробуйте режим XML DOM Node вместе с SAX - (Спасибо @Nzbuu за указание, что выход), но это, как представляется, не имеющие документы функциональности.

Кроме того, если это текстовый файл любого типа (маловероятно, из-за объема данных), попробуйте внешний инструмент для разделения.

+1

XML DOM сначала считывает весь файл в память, так что это вам не поможет; SAX передает XML-данные и создает события для обработки данных. Кроме того, я обнаружил, что обработка объектов DOM в MATLAB происходит медленно. – Nzbuu

+0

@Nzbuu, спасибо. По какой-то причине я считаю, что Matlab всегда использует SAX. Быстрый поиск в Google показал, что вы правы. –

+0

Я думаю, что он использует SAX для создания дерева DOM. – Nzbuu

11

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 

Я не последний релиз теперь проверить, но надеюсь, что это сработает.

1

Вы можете также пользователь от Matlab Memory-Mapping of Data Files читать в блоке файла, процесс, и перейти к следующему блоку без необходимости загружать весь файл в память сразу.

Например, см. this example, который «отображает в память файл из 100 чисел с плавающей запятой с двойной точностью».

+0

Я пробовал этот объект в более раннем выпуске, когда он появился только в MATLAB. Интересно, что MATLAB все равно должен был загрузить весь файл в память. Я связался с поддержкой Mathworks, и они подтвердили это.Они в основном продвинули эту функцию в качестве возможности совместного использования данных между различными приложениями одновременно. Ну, похоже, что все изменилось. Я попробовал это снова с R2011a, а объект 'memmapfile' занимает только 300b. Хороший ответ. +1. Файл должен иметь регулярную структуру для этого объекта (только двоичный?), Поэтому входной файл, вероятно, придется переформатировать в любом случае. – yuk