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') ;

Memmapfile, m, содержит следующие свойства: Filename, Writable, Offset, Format, Repeat, и Data. Чтобы отобразить любое одно свойство, например Format, тип m.Format в командном окне.

m.Format
ans = 
'double'

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

Создайте карту памяти для большого массива int32 данные. Задайте доступ к записи и nondefault 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

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

The 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, содержащий массив uint16 50 на 1 значения, далее поле, 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

The 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

Входные параметры

свернуть все

Имя файла, который будет сопоставлен, включая расширение файла, заданное как вектор символов или строковый скаляр. The 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 на 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) массивом структур, вызов данные. fieldname, где fieldname - имя поля.

  • Если 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