Создайте карту распределения памяти к файлу
сопоставляет существующий файл, m
= memmapfile(filename
)filename
, к памяти и возвращает карту распределения памяти, m
.
Размещение в ОЗУ является механизмом, который сопоставляет фрагмент файла или целого файла, на диске к области значений адресов памяти в адресном пространстве MATLAB®. Затем MATLAB может получить доступ к файлам на диске таким же образом, это получает доступ к динамической памяти, ускоряя чтение файла и запись. Размещение в ОЗУ позволяет вам работать с данными в файле, как будто это был массив MATLAB.
задает свойства m
= memmapfile(filename
,Name,Value
)m
использование одного или нескольких аргументов пары "имя-значение". Например, можно задать формат данных в файле.
uint8
ДанныеВ командной строке создайте файл примера в своей текущей папке под названием 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 значений с двойной точностью.
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
— Имя файла, чтобы сопоставитьИмя файла, чтобы сопоставить включая расширение файла в виде вектора символов или строкового скаляра. 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'
— Тип доступа позволен сопоставленной областиfalse
(значение по умолчанию) | true
Тип доступа, предоставленного к сопоставленной области в виде разделенной запятой пары, состоящей из 'Writable'
и любой true
или false
. Если Writable
свойство установлено в false
, сопоставленная область только для чтения. Если true
, затем доступ для записи позволен.
Пример: 'Writable',true
Типы данных: логический
'Offset'
— Количество байтов от запуска файла, чтобы запуститься сопоставленной областиКоличество байтов от запуска файла к запуску сопоставленной области в виде разделенной запятой пары, состоящей из 'Offset'
и неотрицательное целое число. Это значение основано на нуле. Таким образом, Offset
значение 0 представляет запуск файла.
Пример: 'Offset',1024
Типы данных: double
'Format'
— Формат сопоставленной области'uint8'
(значение по умолчанию) | вектор символов | строковый скаляр | n
- 3 массива ячеекФормат сопоставленного содержимого области в виде разделенной запятой пары, состоящей из '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
'Repeat'
— Число раз, чтобы применить Format
параметрInf
(значение по умолчанию) | положительное целое числоЧисло раз, чтобы применить Format
параметр в сопоставленную область файла в виде разделенной запятой пары, состоящей из 'Repeat'
и положительное целое число. Если значение Repeat
isinf
, затем memmapfile
применяет Format
параметр до конца файла.
Пример: 'Repeat',2000
Типы данных: double
m
— Карта распределения памятиmemmapfile
объектКарта распределения памяти, возвращенная как memmapfile
объект со следующими свойствами.
Свойство | Описание |
---|---|
| Путь и имя отображаемого файла |
| Тип доступа позволен сопоставленной области |
| Количество байтов от запуска файла к запуску сопоставленной области |
| Формат содержимого сопоставленной области, включая тип данных, размер массивов и имя поля, которым можно получить доступ к данным |
| Число раз, чтобы применить шаблон, заданный Format свойство в сопоставленную область файла |
| Данные с отображенной памятью из файла. 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
свойство для того объекта.
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.