Предположим, что вы хотите создать карту распределения памяти для файла с именем 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'