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форматповторение, и 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 свойство игнорировать первые 9 000 байтов в файле и Writable свойство разрешить доступ для записи.

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

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

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

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

Format свойство указывает, что любая операция чтения или операция записи, сделанная с помощью карты распределения памяти, читают и пишут содержимое файла как последовательность 32-битных целых чисел со знаком. Data свойство содержит только 7 750 элементов потому что первые 9 000 байтов records.dat, представление первых 2 250 значений в файле, не сопоставлены.

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

m.Data(1:5)
ans =

        2251
        2252
        2253
        2254
        2255

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

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

randData = gallery('uniformdata',[100,1],0,'double');

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 демонстрационный масштабный коэффициент.

k = 8.21;
[pres1,temp1] = gallery('integerdata',[1,300],[50,1],0,'uint16');
vol1 = double(reshape(k*temp1./pres1,5,10));
[pres2,temp2] = gallery('integerdata',[5,500],[50,1],5,'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-го байта.

Тип доступа позволен сопоставленной области, заданной как разделенная запятой пара, состоящая из 'Writable' и любой true или false. Если Writable свойство установлено в false, сопоставленная область только для чтения. Если true, затем доступ для записи позволен.

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

Типы данных: логический

Количество байтов от запуска файла к запуску сопоставленной области, заданной как разделенная запятой пара, состоящая из 'Offset' и неотрицательное целое число. Это значение основано на нуле. Таким образом, Offset значение 0 представляет запуск файла.

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

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

Формат сопоставленного содержимого области, заданного как разделенная запятой пара, состоящая из 'Format' и односимвольный вектор или скаляр строки или n- 3 массива ячеек.

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

  • Чтобы задать форму массивов, чтобы примениться к чтению данных или записанный в отображаемый файл и имя поля, чтобы сослаться на этот массив, задают Format значение как 1 3 массив ячеек. Первая ячейка содержит вектор символов или скаляр строки идентификация типа данных, чтобы примениться к сопоставленной области. Вторая ячейка содержит измерения массива, чтобы примениться к области. Третья ячейка задает имя поля, чтобы использовать в Data массив структур карты распределения памяти. Задайте имя поля как скаляр строки или вектор символов.
    Пример: {'uint64',[30 4 10],'x'}

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

Можно использовать любой из следующих типов данных, когда вы задаете Format значение:

  • 'int8'

  • 'int16'

  • 'int32'

  • 'int64'

  • 'uint8'

  • 'uint16'

  • 'uint32'

  • 'uint64'

  • 'single'

  • 'double'

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

Число раз, чтобы применить Format параметр в сопоставленную область файла, заданного как разделенная запятой пара, состоящая из 'Repeat' и положительное целое число. Если значение Repeat isinf, затем 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. Данные., где fieldname имя поля.

  • Если Data нескалярный массив структур, вызовите m. Данные (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