Файл карты памяти в MATLAB?

Я решил использовать memmapfile, потому что мои данные (обычно от 30 Гб до 60 Гб) слишком велики, чтобы поместиться в памяти компьютера.

мои файлы данных состоят из двух столбцов данных, которые соответствуют выходам двух датчиков, и у меня есть их в обоих .бункер и. формат txt.

m=memmapfile('G:E-Stress ResearchData13-12-18LD101_3EPS/LD101_3.bin','format','int32')
m.data(1)

я использовал приведенный выше код для сопоставления моих данных с переменной "m", но я понятия не имею, какой формат данных использовать (int8', 'int16', 'int32', 'int64', 'uint8', 'uint16',' uint32',' uint64',' single ' и "двойной"). На самом деле я пробовал все форматы данных, перечисленные в MATLAB, но когда я использовал m.данные (номер индекса) я никогда не получаю пару чисел (2 столбца данных), что я ожидал, также число будет отличаться в зависимости от формата, который я использовал.

Если у кого-то есть опыт работы с memmapfile, пожалуйста, помогите мне.

здесь небольшие версии моих файлов данных, чтобы люди могли понять, как мои данные структурированный:

ура Джеймс!--2-->

1 ответов


memmapfile предназначен для чтения двоичных файлов, поэтому у вас возникли проблемы с текстовым файлом. Данные там есть символы, поэтому вам придется прочитать их как символы, а затем разобрать их на числа. Подробнее об этом ниже.

двоичный файл содержит больше, чем просто поток значений с плавающей запятой, записанных в двоичном формате. Я вижу идентификаторы (строки) и другие вещи в файле, а также. Ваша единственная надежда на чтение-связаться с производителем устройства, создавшего двоичный файл, и спросите их о том, как читать в таких файлах. Вероятно, будет SDK или, по крайней мере, описание формата. Возможно, вы захотите взглянуть на это, поскольку числа с плавающей запятой в вашем текстовом файле могут быть усечены, т. е. вы потеряли точность по сравнению с прямым чтением двоичного представления поплавков.

Ok, так как читать ваш файл с memmapfile? этот пост предоставляет некоторые подсказки.

так сначала мы открываем файл как 'uint8' (обратите внимание, нет 'char' опция, так что в качестве обходного пути мы читаем содержимое файла в тип данных того же размера):

m = memmapfile('RTL5_57.txt','Format','uint8'); % uint8 is default, you could leave that off

мы можем отобразить данные, прочитанные в качестве uint8 как символы, приведя его к char:

c = char(m.Data(1:19)).' % read the first three lines. NB: transpose just for getting nice output, don't use it in your code
c = 
    0.398516    0.063440
    0.399611    0.063284
    0.398985    0.061253

поскольку каждая строка в вашем файле имеет одинаковую длину (2*8 символов для чисел, 1 вкладка и 2 символа для новой строки = 19 символов), мы можем прочитать N строки из файла на чтение N*19 значения. Так что m.Data(1:19) получает ты первая строчка,m.Data(20:38), вторая строка, и m.Data(20:57) вторая и третья строки. Читайте столько, сколько хотите.

тогда нам придется разобрать данные чтения на числа с плавающей запятой:

f = sscanf(c,'%f')
f =
    0.3985
    0.0634
    0.3996
    0.0633
    0.3990
    0.0613

все, что осталось, это изменить их в формате двух столбцов

d = reshape(f,2,[]).'
d =
    0.3985    0.0634
    0.3996    0.0633
    0.3990    0.0613

более простые способы, чем использование memmapfile: Вам не нужно использовать memmapfile, чтобы решить вашу проблему, и я думаю, что это делает вещи более сложными. Вы можете просто используйте fopen следовал по fread:

fid = fopen('RTL5_57.txt');
c = fread(fid,Nlines*19,'*char');
% now sscanf and reshape as above
% NB: one can read the values the text file directly with f = fscanf(fid,'%f',Nlines*19).
% However, in testing, I have found calling fread followed by sscanf to be faster
% which will make a significant difference when reading such large files.

используя это, вы можете прочитать Nlines пары значений за раз, обрабатывать их и просто вызвать fread снова Читать далее Nlines. fread запоминает, где он находится в файле (как и fscanf), поэтому просто используйте тот же вызов, чтобы получить следующие строки. Его таким образом легко написать цикл для обработки всего файла, тестирование с feof(fid) если вы находитесь в конце файла.

предлагается еще более простой способ здесь используйте textscan. Чтобы немного адаптировать свой пример кода:

Nlines = 10000;

% describe the format of the data
% for more information, see the textscan reference page
format = '%f\t%f';

fid = fopen('RTL5_57.txt');

while ~feof(fid)
   C = textscan(fid, format, Nlines, 'CollectOutput', true);
   d = C{1};  % immediately clear C at this point if you need the memory! 
   % process d
end

fclose(fid);

обратите внимание еще раз, однако, что fread следовал по sscanf будет быстрее. Обратите внимание, однако, что fread метод умрет, как только в текстовом файле будет одна строка, которая точно не соответствует вашему формату. textscan прощает изменения пробелов, с другой стороны, и, следовательно, более надежный.