Файл карты памяти в 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
прощает изменения пробелов, с другой стороны, и, следовательно, более надежный.