如何在Matlab中一次性读取二进制文件而不使用循环

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 坐标的向量。我只想加快读取过程。谢谢。欢迎提出其他建议。
3个回答

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

@Griff,你的代码运行缓慢也是因为你在错误的情况下使用了parfor。你应该在这里使用简单的for循环。请阅读这个答案除了你使用for循环之外,你还在处理过于简单的事情时使用了parfor循环。如果一个循环... - carandraug

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

当然,确保你进行测试,因为我没有。在这种工作中,我总是怀疑一位的错误。


0

也许 fread 是你正在寻找的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接