Как я могу загрузить большие файлы (~ 150 МБ) в MATLAB? - PullRequest
9 голосов
/ 03 февраля 2012

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

Ответы [ 3 ]

11 голосов
/ 04 февраля 2012

Начиная с , начиная с версии R2011b (версия 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

У меня нет последней версии для тестирования, но надеюсь, что она будет работать.

3 голосов
/ 03 февраля 2012

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

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

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

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

1 голос
/ 06 февраля 2012

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

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

...