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

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

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

dataRef = m.Data;

for k = 1 : N

y(k) = dataRef(k);

конец

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

for k = 1 : N

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

конец

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

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

randData = gallery('uniformdata',[5000,1],0);

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.8392
    0.6288
    0.1338
    0.2071
    0.6072
    0.6299

Чтение из карты распределения памяти как нескалярная структура

Сопоставьте фрагменты данных в файле, 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 = 166x1 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

   19972   47529   19145   16356   46507   47978   35550   16341
   60686   51944   16362   58647   35418   58072   16338   62509
   51075   16364   54226   34395    8341   16341   33787   57669
   16351   35598    6686   11480   16357   28709   36239    5932
   44292   15577   41755   16362   30311   31712   54813   16353

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

Считайте поле y той структуры из файла.

d(3).y
ans = 4×5

    0.7271    0.3704    0.6946    0.5226    0.2714
    0.3093    0.7027    0.6213    0.8801    0.2523
    0.8385    0.5466    0.7948    0.1730    0.8757
    0.5681    0.4449    0.9568    0.9797    0.7373

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

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

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

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

randData = gallery('uniformdata',[5000,1],0);
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))))

Это - первый раз, когда на данные ссылаются и - когда фактическое отображение файла к адресному пространству 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
    7.5449e+37

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

Похожие темы

Была ли эта тема полезной?