我有一个非常大的文本文件(大约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.
有没有人有这个问题的解决方案?
@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
根据您对代码目的的澄清:
它是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);