2014-11-21 57 views
0

我想读取一个大约2GB的大文本文件并对该数据执行一系列操作。下面的方法在Matlab中使用RAM不足读大文本文件

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()来读取文本文件的各个部分,还是有其他更适合此任务的功能?

编辑:在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

您可以一次读取并处理一行数据吗? – Ayb4btu 2014-11-22 01:33:48

+0

我可以在当时处理它一行,但我不知道如何使用textscan()来读取单个行/列 – McMa 2014-11-24 09:11:12

+0

您可以发布您的文本文件的几行,所以我更好地了解textscan应该如何操作。 – Ayb4btu 2014-11-24 10:20:49

回答

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来看到。

+0

作品,谢谢! – McMa 2014-12-04 10:15:40