как читать чередующиеся данные с помощью memmapfile()?

У меня есть большой (4 ГБ+) файл данных, к которому я хочу получить доступ. Он содержит выборки i ряда различных сигналов {a, b, c} следующим образом:

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 без доступа к полной матрице данных?


person Matt Mizumi    schedule 17.09.2013    source источник


Ответы (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);
person Amro    schedule 17.09.2013

Может быть, попробовать что-то вроде:

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
person MattK    schedule 22.01.2014