1

我有一个大 (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 ?

4

2 回答 2

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);
于 2013-09-17T23:48:43.723 回答
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
于 2014-01-22T12:05:58.627 回答