exponenta event banner

Сопоставить файл с памятью

Создание простой карты памяти

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

Укажите формат сопоставленных данных

По умолчанию MATLAB считает все данные в сопоставленном файле последовательностью неподписанных 8-битных целых чисел. Однако данные могут иметь другой тип. При вызове memmapfile , используйте 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-го байта. 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'

См. также

Связанные темы