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

Создайте простую карту памяти

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

Задайте формат ваших сопоставленных данных

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

См. также

Похожие темы