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