exponenta event banner

memmapfile

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

Описание

пример

m = memmapfile(filename) сопоставляет существующий файл, filename, в память и возвращает карту памяти, m.

Отображение памяти - это механизм, который сопоставляет часть файла или весь файл на диске с диапазоном адресов памяти в адресном пространстве MATLAB ®. Затем MATLAB может получать доступ к файлам на диске таким же образом, как и к динамической памяти, ускоряя чтение и запись файлов. Сопоставление памяти позволяет работать с данными в файле, как если бы это был массив MATLAB.

пример

m = memmapfile(filename,Name,Value) задает свойства m с использованием одного или нескольких аргументов пары имя-значение. Например, можно указать формат данных в файле.

Примеры

свернуть все

В командной строке создайте образец файла в текущей папке с именем records.dat, содержащий 10 uint8 значения.

myData = uint8(1:10)';

fileID = fopen('records.dat','w');
fwrite(fileID, myData,'uint8');
fclose(fileID);

Создание карты для records.dat. При использовании memmapfile, формат данных по умолчанию: uint8 поэтому имя файла является единственным обязательным входным аргументом в данном случае.

m = memmapfile('records.dat')
m = 

    Filename: 'd:\matlab\records.dat'
    Writable: false
      Offset: 0
      Format: 'uint8'
      Repeat: Inf
        Data: 10x1 uint8 array

MATLAB отображает всю records.dat в память, установив для всех свойств карты памяти значения по умолчанию. Карта памяти назначается переменной, m. В этом примере команда отображает весь файл как последовательность неподписанных 8-битных целых чисел и предоставляет вызывающему пользователю доступ только для чтения к его содержимому.

Просмотр сопоставленных данных путем доступа к Data имущество m.

m.Data
ans =

    1
    2
    3
    4
    5
    6
    7
    8
    9
   10

Создайте карту памяти для данных с двойной точностью. Синтаксис аналогичен при указании других типов данных.

В командной строке создайте образец файла в текущей папке с именем records.dat, содержащий 10 double значения.

myData = (1:10)';

fileID = fopen('records.dat','w');
fwrite(fileID,myData,'double');
fclose(fileID);

Создание карты памяти для records.datи установите Format свойство для вывода в 'double'.

m = memmapfile('records.dat','Format','double') ;

Меммапфайл, m, содержит следующие свойства: Filename, Writable, Offset, Format, Repeat, и Data. Отображение любого свойства, например Format, тип m.Format в окне команд.

m.Format
ans = 
'double'

Data свойство содержит 10 значений двойной точности в records.dat.

Создание карты памяти для большого массива int32 данные. Укажите доступ для записи и значение по умолчанию Format и Offset значения.

В командной строке создайте образец файла в текущей папке с именем records.dat, содержащий 10 000 int32 значения.

myData = int32([1:10000]);

fileID = fopen('records.dat','w');
fwrite(fileID,myData,'int32');
fclose(fileID);

Создание карты памяти для records.datи установите Format свойство для вывода в int32. Кроме того, установите Offset для игнорирования первых 9000 байт в файле и Writable свойство для разрешения доступа на запись.

m = memmapfile('records.dat',...
               'Offset',9000,...
               'Format','int32',...
               'Writable',true);

Один Offset значение 9000 указывает, что первые 9000 байт records.dat не сопоставлены.

Введите имя карты памяти, чтобы просмотреть текущие настройки для всех свойств.

m
m =
    Filename: 'd:\matlab\records.dat'
    Writable: true
      Offset: 9000
      Format: 'int32'
      Repeat: Inf
        Data: 7750x1 int32 array

Format свойство указывает, что любая операция чтения или записи, выполняемая через карту памяти, считывает и записывает содержимое файла как последовательность подписанных 32-битных целых чисел. Data свойство содержит только 7750 элементов, поскольку первые 9000 байт records.dat, представляющие первые 2250 значений в файле, не отображаются.

Просмотр первых пяти элементов сопоставленных данных путем доступа к Data имущество m.

m.Data(1:5)
ans =

        2251
        2252
        2253
        2254
        2255

Создайте карту памяти для области файла, содержащей 100 значений двойной точности.

В командной строке создайте образец файла в текущей папке с именем mybinary.bin, содержащий 100 значений двойной точности.

rng('default')
randData = rand([100,1]);

fileID = fopen('mybinary.bin','w');
fwrite(fileID,randData,'double');
fclose(fileID);

Отображение первых 75 значений в mybinary.bin ко множеству ценностей двойной точности 5 на 5 на 3, на которые можно сослаться в структуре карты памяти, используя имя поля x. Задайте эти параметры с помощью Format аргумент пары имя-значение.

m = memmapfile('mybinary.bin',...
               'Format',{'double',[5 5 3],'x'})
m = 

    Filename: 'd:\matlab\mybinary.bin'
    Writable: false
      Offset: 0
      Format: {'double' [5 5 3] 'x'}
      Repeat: Inf
        Data: 1x1 struct array with fields:
                x

Data свойство является массивом структуры, который содержит сопоставленные значения в поле, x.

Назначьте сопоставленные данные переменной, A. Потому что Data свойство является массивом структуры, необходимо индексировать в поле, x, для доступа к данным.

A = m.Data.x;

Просмотр сведений о A.

whos A
  Name      Size             Bytes  Class     Attributes

  A         5x5x3              600  double                       

Отображение сегментов файла с различными формами массива и типами данных в память.

В командной строке создайте образец файла в текущей папке с именем mybinary.bin. Написать uint16 данные и данные с двойной точностью, представляющие значения давления, температуры и объема пробы в файле. В этом случае каждый из uint16 массивы - 50 на 1, массивы двойной точности - 5 на 10. k - коэффициент масштабирования образца.

rng('default')
k = 8.21;
pres1 = randi([1,300],[50,1],'uint16');
temp1 = randi([1,300],[50,1],'uint16');
vol1 = double(reshape(k*temp1./pres1,5,10));
pres2 = randi([5,500],[50,1],'uint16');
temp2 = randi([5,500],[50,1],'uint16');
vol2 = double(reshape(k*temp2./pres2,5,10));

fileID = fopen('mybinary.bin','w');
fwrite(fileID,pres1,'uint16');
fwrite(fileID,temp1,'uint16');
fwrite(fileID,vol1,'double');
fwrite(fileID,pres2,'uint16');
fwrite(fileID,temp2,'uint16');
fwrite(fileID,vol2,'double');
fclose(fileID);

Сопоставьте файл с массивами, доступными по уникальным именам. Определение поля, pressure, содержащий массив 50 на 1 uint16 значения, за которыми следует поле, temperature, содержащий 50 на 1 uint16 значения. Определение поля, volume, содержащий массив значений двойной точности 5 на 10. Используйте массив ячеек для определения формата отображаемой области и повторите шаблон дважды.

m = memmapfile('mybinary.bin',...
'Format',{'uint16',[50 1],'pressure';...
'uint16',[50,1],'temperature';...
'double',[5,10],'volume'},'Repeat',2)
m = 

    Filename: 'd:\matlab\mybinary.bin'
    Writable: false
      Offset: 0
      Format: {'uint16' [50 1] 'pressure'
               'uint16' [50 1] 'temperature'
               'double' [5 10] 'volume'}
      Repeat: 2
        Data: 2x1 struct array with fields:
         pressure
      temperature
           volume

Data свойство карты памяти, m, является массивом структуры 2 на 1, поскольку Format применяется дважды.

Копировать Data свойство переменной, A. Затем просмотрите последний блок double данные, доступ к которым можно получить с помощью имени поля, volume.

A = m.Data;
myVolume = A(2).volume
myVolume =

     2    13    32     5     5    16     4    22     3     8
     2     9    53    38    13    19    23    85     2   120
    29    10     6     1     2     5     6    58    20    11
     7    15     4     1     5    18     1     4    14     8
     9     8     4     2     0     9     8     6     3     3

Входные аргументы

свернуть все

Имя файла для сопоставления, включая расширение файла, указанное как вектор символов или строковый скаляр. filename аргумент не может содержать подстановочные символы (например, * или ?).

Пример: 'myFile.dat'

Типы данных: char | string

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: m = memmapfile('myFile.dat','Format','int32','Offset',255) карты int32 данные в файле, myFile.dat, в память, начиная с 256-го байта.

Разрешение на запись, указано как true или false. При указании falseсопоставленная область доступна только для чтения. При указании trueсопоставленная область имеет разрешения на чтение и запись.

Пример: 'Writable',true

Типы данных: logical

Расстояние от начала файла до начала сопоставленной области, указанное как неотрицательное целое число. Это значение основано на нуле, значение 0 представляет начало файла.

Пример: 'Offset',1024

Типы данных: double

Формат сопоставленной области, указанный как символьный вектор, строковый скаляр или nмассив ячеек -by-3.

Если отображаемая область содержит данные только одного типа, укажите значение Format как вектор символа или скаляр строки, идентифицирующий тип. Например, если данные состоят только из 16-битных целых чисел со знаком, укажите 'int16'. Можно использовать любой из следующих типов данных при указании Format значение:

  • 'int8'

  • 'int16'

  • 'int32'

  • 'int64'

  • 'uint8'

  • 'uint16'

  • 'uint32'

  • 'uint64'

  • 'single'

  • 'double'

Если сопоставляемая область требует указания фигуры массива для данных в сопоставляемом файле, а также имени поля для ссылки на этот массив, укажите Format значение в виде массива ячеек 1 на 3.

  • Первое значение ячейки, указанное как вектор символов или строковый скаляр, назначает тип данных для применения к сопоставленной области.

  • Второе значение ячейки, указанное как массив 1 на n, назначает размеры массива для применения к сопоставленной области.

  • Третье значение ячейки, указанное как вектор символа или скаляр строки, присваивает имя поля, используемое в Data структурный массив карты памяти. Например, {'uint64',[30 4 10],'x'}

Если отображаемая область состоит из сегментов различных типов данных или форм массива, можно указать формат каждого сегмента с помощью строк массива ячеек n-by-3. Например, {'uint64',[30 4 10],'x'; 'uint32',[30 4 6],'y'}

Типы данных: char | string | cell

Количество раз применения Format параметр для сопоставленной области, указанный как Inf или положительное целое число. При указании Inf, memmapfile применяет Format до конца файла.

Пример: 'Repeat',2000

Типы данных: double

Выходные аргументы

свернуть все

Карта памяти, возвращенная как memmapfile со следующими свойствами.

СобственностьОписание

Filename

Путь и имя сопоставленного файла

Writable

Тип доступа к сопоставленной области

Offset

Число байт от начала файла до начала сопоставленной области

Format

Формат содержимого сопоставленной области, включая тип данных, размер массива и имя поля для доступа к данным

Repeat

Количество раз применения шаблона, заданного Format свойство в сопоставленную область файла

Data

Сопоставленные с памятью данные из файла. Data может быть числовым массивом или массивом структуры с именами полей, указанными в Format собственность

Значения для любого свойства (за исключением Data) установлены во время вызова memmapfile, используя аргументы пары имя-значение.

Доступ к любому свойству m с точечной нотацией, аналогичной доступу к полям структурного массива. Например, для доступа к данным, отображенным в памяти, в Data выполните одно из следующих действий:

  • Если Data является числовым массивом, вызов m.Data.

  • Если Data - массив скалярной структуры (1 на 1), вызов m.Data.fieldname, где fieldname - имя поля.

  • Если Data является нескалярным массивом структуры, вызов m.Data(index).fieldname где index является индексом для элемента в массиве структуры, и fieldname - имя поля. Например, для доступа к данным файла в temperature поле первого элемента Data, звонок m.Data(1).temperature.

После создания карты памяти m, можно изменить значение любого из его свойств, кроме Data. Чтобы назначить новое значение, используйте точечную нотацию. Например, для установки нового Offset значение для m, введите:

m.Offset = 2048;

Совет

  • Можно сопоставить только существующий файл. Невозможно создать новый файл и сопоставить его с памятью за одну операцию. Используйте функции ввода-вывода файла MATLAB для создания файла, прежде чем пытаться сопоставить его с памятью.

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

  • memmapfile не разворачивается и не добавляется в сопоставленный файл. Используйте вместо этого стандартные файловые функции ввода-вывода, такие как fopen и fwrite.

Алгоритмы

Фактическое сопоставление файла с адресным пространством MATLAB не выполняется при создании memmapfile объект. Карта памяти, основанная на информации, хранящейся в настоящее время в сопоставляемом объекте, создается при первой ссылке или изменении Data для этого объекта.

Представлен до R2006a