在Matlab中读取RAM不足的大文本文件

时间:2014-11-21 16:26:02

标签: matlab

我想阅读大约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');)后,我的内存使用量出现了一个奇怪的峰值,

立即失败:enter image description here 导入此大小文件的最佳方法是什么?有没有办法使用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

1 个答案:

答案 0 :(得分:1)

如果您可以单独处理每一行,则可以使用以下代码执行此操作。如果您要指定数据块,我已添加start_lineend_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可以看到这一点。