В этом примере показано, как создать две различные карты памяти, а затем считывать из каждой карты с использованием соответствующего синтаксиса. Затем показано, как изменить свойства карты и проанализировать данные.
Содержимое файла, сопоставленного с памятью, можно прочитать с помощью тех же команд 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 dName 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 значения.
В этой части примера показано, как построить график преобразования Фурье данных, считанных из файла через карту памяти. Затем он изменяет несколько свойств существующей карты, считывает из другой части файла данных и строит гистограмму из этих данных.
Создать образец файла с именем 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))))

Это первый случай обращения к данным, когда происходит фактическое сопоставление файла с адресным пространством 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