如何在Matlab中稀疏地读取大文件?

时间:2016-03-07 20:30:04

标签: matlab file-io

我运行了一个模拟,它将一个巨大的文件写入磁盘。该文件是一个大矩阵v。我无法全部阅读,但我真的只需要一部分矩阵,比如1:100的列和行。我想做像

这样的事情
vtag = dlmread('v',1:100:end, 1:100:end);

当然,这不起作用。我知道在写入文件

时我应该只完成以下操作
dlmwrite('vtag',v(1:100:end, 1:100:end));

但我没有,再次运行一切还需要两天时间。

谢谢

阿米尔

1 个答案:

答案 0 :(得分:3)

值得庆幸的是,dlmread功能支持指定范围为the third input。因此,如果您想要读取前100行的所有N列,可以使用以下命令指定

startRow = 1;
startColumn = 1;
endRow = 100;
endColumn = N;

rng = [startRow, startColumn, endRow, endColumn] - 1;
vtag = dlmread(filename, ',', rng);

编辑根据您的澄清

由于您不想要1:100行而是1:100:end行,因此以下方法应该更适合您。

您可以使用textscan一次读取数据块。你可以读一个好的"行然后读入下一个" chunk"要忽略的数据(在此过程中丢弃它),并继续直到到达文件末尾。

下面的代码略微修改了这个想法,除了它使用textscan输入到rows2skip,它指示函数在读入数据之前要忽略多少行。第一次通过循环时,不会跳过任何行,但是通过循环的所有其他时间将跳过startRow = 1; rows2skip = 99; columns = 3000; fid = fopen(filename, 'rb'); % For now, we'll just assume you're reading in floating-point numbers format = repmat('%f ', [1 columns]); count = 1; lines2discard = startRow - 1; while ~feof(fid) % Use "HeaderLines" to skip data before reading in data we care about row = textscan(fid, format, 1, 'Delimiter', ',', 'HeaderLines', lines2discard); data{count} = [row{:}]; % After the first time through, set the "HeaderLines" (i.e. lines to ignore) % to be the # we want to skip between lines (much faster than alternatives!) lines2discard = rows2skip; count = count + 1; end fclose(fid); data = cat(1, data{:}); 行。这使我们能够跳跃"通过文件非常快速地不需要调用任何额外的文件操作。

a*v

您可能需要针对自己的输入类型调整HeaderLines