Предположим, что вы хотите создать карту распределения памяти для файла с именем records.dat
, с помощью функции memmapfile
.
Создайте файл примера под названием records.dat
, содержа 5 000 значений.
myData = gallery('uniformdata', [5000,1], 0); 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
. Свойство Format
указывает, что операции чтения и операции записи в сопоставленную область обрабатывают данные в файле как последовательность чисел с двойной точностью. Свойство Data
содержит эти 5 000 значений из файла, records.dat
. Можно изменить значение любого из свойств, за исключением Data
, после того, как вы создадите карту распределения памяти, m
.
Например, смените стартовое положение карты распределения памяти, m
. Начните сопоставленную область 1 024 байта с запуска файла путем изменения значения свойства Offset
.
m.Offset = 1024
m = Filename: 'd:\matlab\records.dat' Writable: true Offset: 1024 Format: 'double' Repeat: Inf Data: 4872x1 double array
Каждый раз, когда вы изменяете значение свойства карты распределения памяти, MATLAB повторно сопоставляет файл с памятью. Свойство Data
теперь содержит только 4 872 значения.
По умолчанию MATLAB полагает, что все данные в отображаемом файле последовательность 8-битных целых чисел без знака. Однако ваши данные могут иметь различный тип данных. Когда вы вызовете функцию memmapfile
, используйте аргумент пары "имя-значение" Format
, чтобы указать на другой тип данных. Значение Format
может или быть вектором символов, который идентифицирует единый класс, используемый в сопоставленной области или массиве ячеек, который задает больше чем один класс.
Предположим, что вы сопоставляете файл, который составляет 12 килобайтов в длине. Данные, считанные из этого файла, могут быть обработаны как последовательность 6 000 16-битных (2-байтовых) целых чисел, или как 1 500 8-байтовых чисел с плавающей запятой с двойной точностью, чтобы назвать всего несколько возможностей. Вы также могли считать эти данные как комбинацию различных типов: например, как 4 000 8-битных (1-байтовых) целых чисел, сопровождаемых 1 000 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-го байта. Значение 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
. Данные uint32
являются использованием скалярного значения, к которому получают доступ, имени поля, serialno
. Данные 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'