Предположим, что вы хотите создать карту памяти для файла с именем records.dat
, используя memmapfile
функция.
Создайте образец файла с именем records.dat
, содержащая 5000 значений.
rng('default') myData = rand([5000,1]); fileID = fopen('records.dat','w'); fwrite(fileID, myData,'double'); fclose(fileID);
Затем создайте карту памяти. Используйте Format
аргумент пары "имя-значение", чтобы указать, что значения имеют тип double
. Используйте Writable
аргумент пары "имя-значение", разрешающий доступ для записи в сопоставленную область.
m = memmapfile('records.dat', ... 'Format', 'double', ... 'Writable', true)
m = Filename: 'd:\matlab\records.dat' Writable: true Offset: 0 Format: 'double' Repeat: Inf Data: 5000x1 double array
MATLAB® создает memmapfile
объект, m
. The Format
свойство указывает, что операции чтения и записи в сопоставленную область обрабатывают данные в файле как последовательность чисел двойной точности. The Data
свойство содержит 5000 значений из файла, records.dat
. Вы можете изменить значение любого из свойств, кроме Data
, после того, как вы создали карту памяти, m
.
Например, измените начальное положение карты памяти, m
. Начните отображенную область 1024 байт с начала файла, изменив значение Offset
свойство.
m.Offset = 1024
m = Filename: 'd:\matlab\records.dat' Writable: true Offset: 1024 Format: 'double' Repeat: Inf Data: 4872x1 double array
Всякий раз, когда вы изменяете значение свойства карты памяти, MATLAB изменяет файл в память. The Data
Теперь свойство содержит только 4872 значения.
По умолчанию MATLAB рассматривает все данные в отображаемом файле как последовательность беззнаковых 8-битных целых чисел. Однако данные могут иметь различные типы данных. Когда вы вызываете memmapfile
function, использовать Format
аргумент пары "имя-значение" для указания другого типа данных. Значение Format
может быть либо вектор символов, которая идентифицирует один класс, используемый во всей сопоставленной области, либо массив ячеек, который задает несколько классов.
Предположим, что вы сопоставили файл длиной 12 килобайт. Данные, считанные из этого файла, могут быть обработаны как последовательность из 6000 16-битных (2-байтовых) целых чисел или как 1500 8-байтовое число с плавающей запятой двойной точности, чтобы назвать лишь несколько возможностей. Можно также считать эти данные как комбинацию различных типов: например, как 4000 8-битных (1-байтовых) целых чисел, за которыми следуют 1000 64-битных (8-байтовых) целых чисел. Можно определить, как MATLAB интерпретирует сопоставленные данные, установив Format
свойство карты памяти при вызове memmapfile
функция.
Массивы MATLAB хранятся на диске в основном порядке. Последовательность элементов массива - столбец 1, строка 1; столбец 1, строка 2; столбец 1, последняя строка; столбец 2, строка 1 и так далее. Вам может потребоваться транспонировать или переставить порядок элементов массива при чтении или записи через карту памяти.
Если область, которую вы отображаете, содержит сегменты различных типов данных или форм массива, можно задать отдельный формат для каждого сегмента. Задайте значение Format
аргумент пары "имя-значение" как n
-by-3 массив ячеек, где n
количество сегментов. Каждая строка массива ячеек соответствует сегменту. Первая камера в строке определяет тип данных, применяемых к сопоставленному сегменту. Вторая камера содержит измерения массива, применяемые к сегменту. Третья камера содержит имя поля для ссылки на этот сегмент. Для карты памяти, m
, используйте следующий синтаксис:
m = memmapfile(filename, ... 'Format', { ... datatype1, dimensions1, fieldname1; ... datatype2, dimensions2, fieldname2; ... : : : ... datatypeN, dimensionsN, fieldnameN})
Предположим, у вас есть файл длиной 40 000 байт. Следующий код отображает данные, начиная с 2048-го байта. The Format
значение является массивом ячеек 3 на 3, который сопоставляет данные файла с тремя различными классами: int16
, uint32
, и single
.
m = memmapfile('records.dat', ... 'Offset', 2048, ... 'Format', { ... 'int16' [2 2] 'model'; ... 'uint32' [1 1] 'serialno'; ... 'single' [1 3] 'expenses'});
В этом случае memmapfile
отображает int16
данные как матрица 2 на 2, к которой можно получить доступ с помощью имени поля, model
. The uint32
данные являются скалярным значением, доступным с помощью имени поля, serialno
. The single
данные является матрицей 1 на 3 с именем expenses
. Каждое из этих полей принадлежит массиву структур 800 на 1, m.Data
.
Этот рисунок показывает отображение файла примера.
Следующий рисунок показывает упорядоченное расположение элементов массива более тесно. В частности, это иллюстрирует, что массивы MATLAB хранятся на диске в основном порядке. Последовательность элементов массива в отображаемый файл - строка 1, столбец 1; строка 2, столбец 1; строка 1, столбец 2; и строку 2, столбец 2.
Если данные в вашем файле не хранятся в этом порядке, вам может потребоваться транспонировать или переставить порядок элементов массива при чтении или записи через карту памяти.
Вы можете изменить значение Filename
свойство в любое время после построения memmapfile
объект. Вы можете сделать это, если:
Вы хотите использовать ту же memmapfile
объект в нескольких файлах.
Вы сохраняете свои memmapfile
объект в MAT-файл, а затем позже загрузить его обратно в MATLAB в окружении, в которой отображаемый файл был перемещен в другое место. Это требует, чтобы вы изменили сегмент контура Filename
для представления нового местоположения.
Обновите путь в Filename
свойство для карты памяти, использующей запись через точку. Например, чтобы задать новый путь, f:\testfiles\records.dat
для карты памяти, m
, тип:
m.Filename = 'f:\testfiles\records.dat'