Отображение файла с памятью

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

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

Если данные в вашем файле не хранимы в этом порядке, вы можете должны быть транспонировать или перестроить порядок элементов массива при чтении или записи с помощью карты распределения памяти.

Выбор File to Map

Можно изменить значение свойства Filename в любое время после построения объекта memmapfile. Вы можете хотеть сделать это если:

  • Вы хотите использовать тот же объект memmapfile больше чем на одном файле.

  • Вы сохраняете свой объект memmapfile в MAT-файл, и затем более позднюю загрузку это назад в MATLAB в среде, куда отображаемый файл был перемещен в другое место. Это требует, чтобы вы изменили сегмент пути Filename, чтобы представлять новое местоположение.

Обновите путь в свойстве Filename для карты распределения памяти с помощью записи через точку. Например, чтобы задать новый путь, f:\testfiles\records.dat для карты распределения памяти, m, вводит:

m.Filename = 'f:\testfiles\records.dat'

Смотрите также

Похожие темы