Решение проблемы "нехватка памяти" в Matlab - PullRequest
2 голосов
/ 25 апреля 2019

У меня очень большой размер текстового файла (около 11 ГБ), который нужно загрузить в matlab.but, но когда я использую функцию «textread», возникает ошибка «Недостаточно памяти». И нет способа уменьшить размер файла , когда я набираю память, покажи это мне.

memory
Maximum possible array:     24000 MB (2.517e+10 bytes) *
Memory available for all arrays:     24000 MB (2.517e+10 bytes) *
Memory used by MATLAB:      1113 MB (1.167e+09 bytes)
Physical Memory (RAM):     16065 MB (1.684e+10 bytes)

*  Limited by System Memory (physical + swap file) available.

У кого-нибудь есть решение этой проблемы?

Ответы [ 2 ]

5 голосов
/ 25 апреля 2019

@ Энтони предложил способ построчного чтения файла, что прекрасно, но более поздние (> = R2014b) версии MATLAB имеют функциональность datastore, которая предназначена для обработка больших файлов данных кусками.

Существует несколько типов datastore, доступных в зависимости от формата вашего текстового файла. В простейших случаях (например, файлы CSV) автоматическое обнаружение работает хорошо, и вы можете просто сказать

ds = datastore('myCsvFile.csv');
while hasdata(ds)
    chunkOfData = read(ds);
    ... compute with chunkOfData ...
end

В еще более поздних (> = R2016b) версиях MATLAB вы можете сделать еще один шаг и обернуть datastore в массив tall. Массивы tall позволяют работать с данными, которые слишком велики, чтобы помещаться в память одновременно. (За кулисами tall массивы выполняют вычисления по частям и дают вам результаты только тогда, когда вы запрашиваете их через вызов gather). Например:

tt = tall(datastore('myCsvFile.csv'));
data = tt.SomeVariable;
result = gather(mean(data)); % Trigger tall array evaluation
2 голосов
/ 25 апреля 2019

Согласно вашему разъяснению цели вашего кода:

это облако точек со столбцом XYZRGB в текстовом файле, и мне нужно добавить еще один столбец к этому.

Я предлагаю вам прочитать текстовый файл по одной строке за раз, изменить строку и записать измененную строку прямо в новый текстовый файл.

Чтобы прочитать одинстрока за раз:

% Open file for reading.
fid = fopen(filename, 'r');

% Get the first line.
line = fgetl(fid);
while ~isnumeric(line)
    % Do something.

    % get the next line
    line = fgetl(fid);
end
fclose(fid);

Чтобы написать строку, вы можете использовать fprintf.

Вот демонстрация:

filename = 'myfile.txt';
filename_new = 'myfile_new.txt';

fid = fopen(filename);
fid_new = fopen(filename_new,'w+');
line = fgetl(fid);
while ~isnumeric(line)
    % Make sure you add \r\n at the end of the string; 
    % otherwise, your text file will become a one liner.
    fprintf(fid_new, '%s %s\r\n', line, 'new column');
    line = fgetl(fid);
end
fclose(fid);
fclose(fid_new);
...