我想阅读大约2GB的大文本文件,并对该数据执行一系列操作。遵循方法
tic
fid=fopen(strcat(Name,'.dat'));
C=textscan(fid, '%d%d%f%f%f%d');
fclose(fid);
%Extract cell values
y=C{1}(1:Subsampling:end)/Subsampling;
x=C{2}(1:Subsampling:end)/Subsampling;
%...
Reflectanse=C{6}(1:Subsampling:end);
Overlap=round(Overlap/Subsampling);
在阅读C(C=textscan(fid, '%d%d%f%f%f%d');
)后,我的内存使用量出现了一个奇怪的峰值,立即失败:
导入此大小文件的最佳方法是什么?有没有办法使用textscan()
来读取文本文件的各个部分,还是有更适合此任务的其他函数?
编辑:文本扫描中的每一列都包含3D点的信息字段信息:
width hieght X Y Z Grayscale
345 453 3.422 53.435 0.234 200
346 453 3.545 52.345 0.239 200
... % and so on for ~40 millon points
答案 0 :(得分:1)
如果您可以单独处理每一行,则可以使用以下代码执行此操作。如果您要指定数据块,我已添加start_line
和end_line
。
headerSpec = '%s %s %s %s %s %s';
dataSpec = '%f %f %f %f %f %f';
fid=fopen('data.dat');
% Read Header
names = textscan(fid, headerSpec, 1, 'delimiter', '\t');
k = 0;
% specify a start and end line for getting a block of data
start_line = 2;
end_line = 3;
while ~feof(fid)
k=k+1;
if k < start_line
continue;
end
if k > end_line
break;
end
% get data
C = textscan(fid, dataSpec, 1, 'delimiter', '\t');
row = [C{1:6}]; % convert data from cell to vector
% do what you want with the row
end
fclose(fid);
有可能读取整个文件,但这取决于您可用的内存量以及matlab是否有任何限制。通过在命令窗口键入memory
可以看到这一点。