我有一个我想访问的大型(4GB +)数据文件。它包含许多不同信号{ a , b , c }的样本 i ,如下所示:
a_1 b_1 c_1 a_2 b_2 c_2 .... a_n b_n c_n
我想使用memmapfile来检索 a 流。由于我知道信号的数量和样本的数量,我试过:
m = memmapfile('data.dat','Format',{'int16',[nSignals 1],'sid'},'repeat',nSamples);
但这会返回无用的 m 字段
Data: nSamples x 1 struct array with fields:
sid
当然以下工作正常,但速度很慢:
m = memmapfile('data.dat','Format','int16');
a = m.Data(1:nSignals:end);
如何在不必访问完整数据矩阵的情况下恢复 a ?
答案 0 :(得分:2)
如何使用FREAD并指定适当的skip
值。以下内容将一次性读取信号a
:
% 3 interleaved signals each of type int16
nSignals = 3;
% amount of bytes to skip after reading each sample
szINT16 = 2; % sizeof(int16)=2
skipBytes = (nSignals-1)*szINT16;
% number of samples in each signal (Inf to read all samples)
nSamples = Inf;
fid = fopen('data.dat','rb');
a = fread(fid, nSamples, '*int16', skipBytes);
fclose(fid);
您可以对其他两个信号执行相同操作,您只需要寻找正确的起始位置:
fseek(fid, szINT16*1, 'bof');
b = fread(fid, nSamples, '*int16', skipBytes);
fseek(fid, szINT16*2, 'bof');
c = fread(fid, nSamples, '*int16', skipBytes);
答案 1 :(得分:0)
也许尝试一下:
m = memmapfile('data.dat',
'Format',
{ 'int16' [1 1] 'a'; 'int16' [1 1] 'b'; 'int16' [1 1] 'c'},
'Repeat', nSamples);
a = m.Data(:).a; % extract all instances of a