3

我有这个文件,它是一系列超过 3400 万个粒子的 x、y、z 坐标,我正在按如下方式读取它们:

parfor i = 1:Ntot
 x0(i,1)=fread(fid, 1, 'real*8')';
 y0(i,1)=fread(fid, 1, 'real*8')';
 z0(i,1)=fread(fid, 1, 'real*8')';
end

有没有办法在不循环的情况下阅读它?这将大大加快读取速度。我只想要三个带有 x、y、z 的向量。我只是想加快读取过程。谢谢。欢迎提出其他建议。

4

3 回答 3

3

我没有装有 Matlab 的机器,也没有要测试的文件,但我认为coordinates = fread (fid, [3, Ntot], 'real*8')应该可以正常工作。

于 2012-12-09T06:15:50.373 回答
0

也许fread是您正在寻找的功能。

于 2012-12-09T06:02:29.137 回答
0

你是对的。大批量读取数据通常是加快文件读取速度的关键部分。另一部分是预先分配目标变量零,例如zeros调用。

我会做这样的事情:

%Pre-allocate
x0 = zeros(Ntot,1);
y0 = zeros(Ntot,1);
z0 = zeros(Ntot,1);

%Define a desired batch size.  make this as large as you can, given available memory.
batchSize = 10000;

%Use while to step through file    
indexCurrent = 1;           %indexCurrent is the next element which will be read
while indexCurrent <= Ntot

    %At the end of the file, we may need to read less than batchSize
    currentBatch = min(batchSize,  Ntot-indexCurrent+1);

    %Load a batch of data
    tmpLoaded = fread(fid, currentBatch*3, 'read*8')';

    %Deal the fread data into the desired three variables
    x0(indexCurrent + (0:(currentBatch-1))) = tmpLoaded(1:3:end);
    y0(indexCurrent + (0:(currentBatch-1))) = tmpLoaded(2:3:end);
    z0(indexCurrent + (0:(currentBatch-1))) = tmpLoaded(3:3:end);

    %Update index variable
    indexCurrent = indexCurrent + batchSize;
end

当然,请确保您进行测试,因为我没有。我总是怀疑这类工作中的一个接一个错误。

于 2012-12-09T06:15:30.310 回答