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