主要内容

将文件映射到内存

创建一个简单的内存地图

假设您想为一个名为records.dat,使用memmapfile函数。

创建一个名为records.dat,包含5000个值。

rng (“默认”) myData = rand([50001]);文件标识= fopen (“records.dat”' w ');写入文件(文件标识,myData,“双”);文件关闭(文件标识);

接下来,创建内存映射。使用格式名称-值对参数,以指定值的类型.使用可写的名称-值对参数,以允许对映射区域的写访问。

m = memmapfile (“records.dat”...“格式”“双”...可写的,真正的)
m = Filename: 'd:\matlab\records.dat' Writable: true Offset: 0 Format: 'double' Repeat: Inf Data: 5000x1 double数组

MATLAB®创建一个memmapfile对象,.的格式属性指示对映射区域的读写操作将文件中的数据视为双精度数字序列。的数据属性包含文件中的5000个值,records.dat.您可以更改任何属性的值,除了数据,在创建内存映射后,

例如,改变内存映射的起始位置,.属性的值使映射区域从文件开始的1024字节开始抵消财产。

m.Offset = 1024
m = Filename: 'd:\matlab\records.dat' Writable: true Offset: 1024 Format: 'double' Repeat: Inf Data: 4872x1 double array . log . log . log . log

当你改变内存映射属性的值时,MATLAB会将文件重新映射到内存中。的数据属性现在只包含4872个值。

指定映射数据的格式

默认情况下,MATLAB认为映射文件中的所有数据都是无符号8位整数序列。但是,您的数据可能是不同的数据类型。当你呼叫memmapfile功能,使用格式名称-值对参数,以指示另一种数据类型。的价值格式可以是标识整个映射区域中使用的单个类的字符向量,也可以是指定多个类的单元格数组。

假设映射一个长度为12千字节的文件。从该文件中读取的数据可以被视为一个由6,000个16位(2字节)整数组成的序列,或者作为1,500个8字节双精度浮点数(仅举几个例子)来处理。您还可以将此数据作为不同类型的组合来读取:例如,作为4,000个8位(1字节)整数后面跟着1,000个64位(8字节)整数。您可以确定MATLAB将如何解释映射数据通过设置格式的内存映射属性memmapfile函数。

MATLAB数组以列主顺序存储在磁盘上。数组元素的序列是第1列,第1行;第1列,第2行;第1列,最后一行;第二列,第一行,等等。通过内存映射进行读写时,可能需要对数组元素进行转置或重新排列顺序。

映射多个数据类型和数组

如果要映射的区域包含不同数据类型或数组形状的段,则可以为每个段指定单独的格式。的值格式名称-值对参数作为n-by-3 cell array,其中n为段的个数。单元格数组中的每一行对应一个段。行中的第一个单元格标识要应用到映射段的数据类型。第二个单元格包含应用于段的数组维数。第三个单元格包含用于引用该段的字段名。对于内存映射,,使用以下语法:

m = memmapfile(文件名,...“格式”, {...datatype1、dimensions1 fieldname1;...datatype2、dimensions2 fieldname2;...:::...datatypeN、dimensionsN fieldnameN})

假设您有一个长度为40000字节的文件。下面的代码映射从2048字节开始的数据。的格式Value是一个3乘3的单元格数组,它将文件数据映射到三个不同的类:int16uint32,

m = memmapfile (“records.dat”...“抵消”, 2048,...“格式”, {...“int16”(2 - 2)“模型”...“uint32”[1]“serialno”...“单一”3 [1]“费用”});

在这种情况下,memmapfile地图的int16数据是一个2乘2的矩阵,可以使用字段名访问,模型.的uint32Data是使用字段名访问的标量值,serialno.的Data是一个1 × 3的矩阵费用.这些字段都属于800乘1的结构数组,m.Data

该图显示了示例文件的映射。

下一个图更接近数组元素的顺序。特别地,它说明了MATLAB数组是按列主顺序存储在磁盘上的。映射文件中的数组元素序列为第1行第1列;第2行第1列;第1行,第2列;第二行第二列。

如果文件中的数据不是按这个顺序存储的,那么在通过内存映射进行读写时,可能需要调换或重新排列数组元素的顺序。

选择要映射的文件

的值可以更改文件名属性的memmapfile对象。你可能想这样做,如果:

  • 你想用同样的memmapfile对象在多个文件上。

  • 你拯救你memmapfile对象加载到mat文件中,然后在映射文件已移动到不同位置的环境中将其加载回MATLAB。的路径段文件名表示新位置。

中的路径更新文件名属性使用点符号表示内存映射。例如,要指定一个新路径,f: \测试文件\ records.dat对于内存映射,类型:

m.Filename =f: \测试文件\ records.dat”

另请参阅

相关的话题