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

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

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

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

Похожие темы