Matlab中“内存不足”错误的解决方案

时间:2019-04-25 10:12:54

标签: matlab out-of-memory

我有一个很大的文本文件大小(大约11GB),需要在matlab中加载。但是当我使用“ 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 个答案:

答案 0 :(得分:5)

@Anthony提出了一种逐行读取文件的方法,这非常好,但是最新版本(> = 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

答案 1 :(得分:2)

根据您对代码用途的说明:

  

这是点云,txt文件中有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);