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

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

Можно считать содержимое файла, который вы сопоставили с памятью с помощью тех же команд 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 значение 1 024, чтобы начать карту 1 024 байта с запуска файла. Задайте 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' });

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 значения.

Modify Map Properties и анализирует данные

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

Создайте файл примера под названием double.dat.

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

Создайте memmapfile object из 1 000 элементов типа 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 object. The axes object 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

Смотрите также

Похожие темы