memmapfile
创建文件的内存映射
说明
示例
映射包含 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 位整数,并授予调用者对其内容的只读访问权限。
通过访问 m
的 Data
属性来查看映射数据。
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'
Data
属性包含 records.dat
中的 10 个双精度值。
映射和更改文件的一部分
为包含 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
表示未映射 records.dat
的前 9000 字节。
键入内存映射名称以查看所有属性的当前设置。
m
m = Filename: 'd:\matlab\records.dat' Writable: true Offset: 9000 Format: 'int32' Repeat: Inf Data: 7750x1 int32 array
Format
属性表示通过内存映射执行的任何读写操作都会将文件内容读写为一系列有符号 32 位整数。由于未映射 records.dat
的前 9000 字节(表示文件中的前 2250 个值),因此,Data
属性仅包含 7750 个元素。
通过访问 m
的 Data
属性来查看映射数据的前五个元素。
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);
将 mybinary.bin
中的前 75 个值映射至包含双精度值的 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
(包含具有 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
由于将 Format
应用了两次,因此,内存映射 m
的 Data
属性为 2×1 结构体数组。
将 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
名称-值参数
将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参量名称,Value
是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: m = memmapfile('myFile.dat','Format','int32','Offset',255)
将 myFile.dat
文件中的 int32
数据映射至内存(从第 256 个字节开始)。
Writable
— 写权限
false
(默认) | true
写权限,指定为 true
或 false
。如果指定 false
,则映射区为只读。如果指定 true
,则映射区同时具有读写权限。
示例: 'Writable',true
数据类型: logical
Offset
— 距文件开头的距离
0 (默认) | 非负整数
从文件开头到映射区开头的距离,指定为非负整数。此值从 0 开始,0 表示文件的开头。
示例: 'Offset',1024
数据类型: double
Format
— 映射区的格式
'uint8'
(默认) | 字符向量 | 字符串标量 | n
×3 元胞数组
映射区的格式,指定为字符向量、字符串标量或 n
×3 元胞数组。
如果要映射的区域仅包含一种类型的数据,则将格式值指定为字符向量或字符串标量,以标识该类型。例如,如果您的数据仅由 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
Repeat
— Format
参数的应用次数
Inf
(默认) | 正整数
将 Format
参数应用于映射区的次数,指定为 Inf
或正整数。如果指定 Inf
,memmapfile
会将 Format
参数一直应用到文件末尾。
示例: 'Repeat',2000
数据类型: double
输出参量
m
— 内存映射
memmapfile
对象
内存映射,以具有下列属性的 memmapfile
对象的形式返回。
属性 | 描述 |
---|---|
| 映射文件的路径和名称 |
| 访问映射区的所允许类型 |
| 从文件开头到映射区开头的字节数 |
| 映射区的内容格式,包括数据类型、数组大小以及用于访问数据的字段名称 |
| 向文件映射区应用 Format 属性所指定的模式的次数 |
| 文件中的内存映射数据。Data 可以是具有 Format 属性中指定的字段名称的数值数组或结构体数组 |
调用 memmapfile
时,将使用名称-值对组参量设置所有属性(Data
除外)的值。
使用圆点表示法(与访问结构体数组的字段类似)访问 m
的任意属性。例如,要访问 Data
属性中的内存映射数据,请执行下列操作之一:
如果
Data
是数值数组,请调用m.Data
。如果
Data
是标量 (1×1) 结构体数组,请调用m.Data.
,其中fieldname
fieldname
是字段名称。如果
Data
是非标量结构体数组,请调用m.Data(
,其中index
).fieldname
index
是结构体数组中元素的索引,fieldname
是字段名称。例如,要访问Data
第一个元素的temperature
字段中的文件数据,请调用m.Data(1).temperature
。
在创建内存映射 m
之后,可以更改其任何属性(Data
除外)的值。要赋新值,请使用圆点表示法。例如,要设置 m
的新 Offset
值,请键入:
m.Offset = 2048;
提示
算法
在构造 memmapfile
对象时不会进行文件到 MATLAB 地址空间的实际映射。在您首次引用或修改映射对象的 Data
属性时,将基于当前存储在该对象中的信息生成一个内存映射。
版本历史记录
在 R2006a 之前推出
另请参阅
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)