Main Content

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 位整数,并授予调用者对其内容的只读访问权限。

通过访问 mData 属性来查看映射数据。

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)包含以下属性:FilenameWritableOffsetFormatRepeatData。要显示任何一个属性,例如 Format,请在命令行窗口中键入 m.Format

m.Format
ans = 
'double'

Data 属性包含 records.dat 中的 10 个双精度值。

为包含 int32 数据的大型数组创建内存映射。指定写访问权限以及非默认 FormatOffset 值。

在命令提示符处,在名为 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);

Offset9000 表示未映射 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 个元素。

通过访问 mData 属性来查看映射数据的前五个元素。

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 应用了两次,因此,内存映射 mData 属性为 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 参数不能包含任何通配符(例如 *?)。

示例: 'myFile.dat'

数据类型: char | string

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: m = memmapfile('myFile.dat','Format','int32','Offset',255)myFile.dat 文件中的 int32 数据映射至内存(从第 256 个字节开始)。

写权限,指定为 truefalse。如果指定 false,则映射区为只读。如果指定 true,则映射区同时具有读写权限。

示例: 'Writable',true

数据类型: logical

从文件开头到映射区开头的距离,指定为非负整数。此值从 0 开始,0 表示文件的开头。

示例: 'Offset',1024

数据类型: double

映射区的格式,指定为字符向量、字符串标量或 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

Format 参数应用于映射区的次数,指定为 Inf 或正整数。如果指定 Infmemmapfile 会将 Format 参数一直应用到文件末尾。

示例: 'Repeat',2000

数据类型: double

输出参数

全部折叠

内存映射,以具有下列属性的 memmapfile 对象的形式返回。

属性描述

Filename

映射文件的路径和名称

Writable

访问映射区的所允许类型

Offset

从文件开头到映射区开头的字节数

Format

映射区的内容格式,包括数据类型、数组大小以及用于访问数据的字段名称

Repeat

向文件映射区应用 Format 属性所指定的模式的次数

Data

文件中的内存映射数据。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;

提示

  • 您只能映射现有文件。您不能通过一次操作来创建一个新文件并将该文件映射到内存。请使用 MATLAB 文件 I/O 函数创建文件,然后再尝试将该文件映射到内存。

  • memmapfile 找到该文件之后,MATLAB 会将文件的绝对路径名存储在内部,然后从此时起使用此存储路径来查找文件。因此,您可以在当前工作目录以外的其他目录中操作,并保留对映射文件的访问权限。

  • memmapfile 不会扩展或追加到映射文件。改用诸如 fopenfwrite 之类的标准文件 I/O 函数。

算法

在构造 memmapfile 对象时不会进行文件到 MATLAB 地址空间的实际映射。在您首次引用或修改映射对象的 Data 属性时,将基于当前存储在该对象中的信息生成一个内存映射。

版本历史记录

在 R2006a 之前推出