Чтение из отображаемого файла

В этом примере показано, как создать две различные карты памяти, а затем считать с каждой из карт с помощью соответствующего синтаксиса. Затем он показывает, как изменить свойства карты и проанализировать ваши данные.

Вы можете считать содержимое файла, который вы сопоставили с памятью, с помощью тех же команд MATLAB ®, которые вы используете для чтения переменных из рабочего пространства MATLAB. Путем доступа к Data свойство карты памяти, содержимое отображаемого файла отображается как массив в текущей активной рабочей области. Чтобы считать данные, которые вы хотите из файла, просто индексируйте в массив. Для повышения эффективности скопируйте Data поле переменной, а затем чтение отображаемого файла с помощью этой переменной:

dataRef = m.Data;

for k = 1 : N

y(k) = dataRef(k);

end

Напротив, чтение непосредственно из memmapfile объект медленнее:

for k = 1 : N

y(k) = m.Data(k);

end

Чтение из карты памяти как числового массива

Сначала создайте файл выборочных данных с именем records.dat который содержит 5000 на 1 матрицу двойной точности чисел с плавающей запятой.

rng('default')
randData = rand([5000,1]);

fileID = fopen('records.dat','w');
fwrite(fileID,randData,'double'); 
fclose(fileID);

Сопоставьте 100 числа с плавающей запятой двойной точности из файла в память, а затем считайте фрагмент сопоставленных данных. Создайте карту памяти, m. Задайте Offset значение 1024, чтобы начать сопоставление 1024 байта с начала файла. Задайте Repeat значение 100 для отображения 100 значений.

m = memmapfile('records.dat','Format','double', ...
      'Offset',1024,'Repeat',100);

Скопируйте Data свойство переменной, d. Затем покажите формат d.

d = m.Data;

whos d
  Name        Size            Bytes  Class     Attributes

  d         100x1               800  double              

Сопоставленные данные являются 800-байтовым массивом, потому что их 100 double значения, каждый из которых требует 8 байт.

Считайте выбранное значение чисел из файла путем индексации в вектор, d.

d(15:20)
ans = 6×1

    0.3510
    0.5132
    0.4018
    0.0760
    0.2399
    0.1233

Считайте с карты памяти как нескалярную структуру

Отобразите фрагменты данных в файле, records.dat, как последовательность нескольких типов данных.

Вызовите memmapfile функция для создания карты памяти, m.

  m = memmapfile('records.dat',  ...
      'Format', {              ...
         'uint16' [5 8] 'x';   ...
         'double' [4 5] 'y' });

The Format параметр говорит memmapfile обработать первые 80 байт файла как матрицу 5 на 8 uint16 значений, и 160 байт после этого как матрица 4 на 5 double значения. Этот шаблон повторяется до тех пор, пока не будет достигнут конец файла.

Скопируйте Data свойство переменной, d.

d = m.Data
d=166×1 struct array with fields:
    x
    y

d представляет собой массив структур с 166 элементами с двумя полями. d является нескалярным массивом структур, поскольку файл сопоставлен как повторяющаяся последовательность нескольких типов данных.

Исследуйте одну структуру в массиве, чтобы показать формат каждого поля.

d(3)
ans = struct with fields:
    x: [5x8 uint16]
    y: [4x5 double]

Чтение x поле этой структуры из файла.

d(3).x
ans = 5x8 uint16 matrix

   62645   30353   12492   16358   58958    9377   48754   16323
   14152   21370   16352   21042   61010   33482   16321   22042
    2657   16336   37389   35249   45699   16353   47136   59002
   16360   41668    9638   33351   16366    3344   58286   31491
    5368   55234   24278   16364   55768    7216    7184   16336

MATLAB форматирует блок данных как матрицу 5 на 8 uint16 значения, заданные Format свойство.

Чтение y поле этой структуры из файла.

d(3).y
ans = 4×5

    0.8407    0.9293    0.6160    0.5853    0.7572
    0.2543    0.3500    0.4733    0.5497    0.7537
    0.8143    0.1966    0.3517    0.9172    0.3804
    0.2435    0.2511    0.8308    0.2858    0.5678

MATLAB форматирует блок данных как матрицу 4 на 5 double значения.

Изменение свойств карты и анализ данных

Эта часть примера показывает, как построить график преобразования Фурье данных, считанных из файла через карту памяти. Затем он изменяет несколько свойств существующей карты, читает из другой части файла данных и строит гистограмму из этих данных.

Создайте образец файла с именем double.dat.

randData = rand([5000,1]);
fileID = fopen('double.dat','w');
fwrite(fileID,randData,'double'); 
fclose(fileID);

Создайте memmapfile object из 1000 элементов типа double, начиная с 1025-го байта.

m = memmapfile('double.dat','Offset',1024,  ...
      'Format','double','Repeat',1000);

Скопируйте Data свойство переменной, k. Затем получите данные, сопоставленные с картой, и постройте график БПФ первых 100 значений карты.

k = m.Data;
plot(abs(fft(k(1:100))))

Figure contains an axes. The axes contains an object of type line.

Это первый случай ссылки на данные, и когда происходит фактическое отображение файла с адресным пространством MATLAB.

Измените свойства карты, но продолжите использовать тот же файл. Всякий раз, когда вы изменяете значение свойства карты памяти, MATLAB изменяет файл в память.

m.Offset = 4096;
m.Format = 'single';
m.Repeat = 800;

m теперь является memmapfile объект 800 элементов типа single. Теперь карта начинается с 4096-го байта в файле, records.dat.

Считайте из фрагмента файла, которая начинается с 4096-го байта, и вычислите максимальное значение данных. Эта команда отображает новую область и отменяет сопоставление предыдущей области.

X = max(m.Data)
X = single
    3.2278e+38

См. также

Похожие темы