在maltab程序中,经常需要读取一些.mat格式的数据文件,如果文件非常大,内存装不下或者加载时间过长,我们可以通过matlab提供了内存映射文件机制(memroy mapped file)[1]来解决这一问题。内存文件映射是一种内存管理方法,应用程序可以通过内存指针对磁盘上的文件进行访问,从而不需要预先将整个文件加载到内存中去。
Matlab内存映射文件的语法格式如下:
m = memmapfile(filename)
m = memmapfile(filename, prop1, value1, prop2, value2, ...)
memmapfile(filename)创建了一个默认参数的内存映射文件,而m = memmapfile(filename, prop1, value1, prop2, value2, ...)创建一个指定参数的内存映射文件,参数设置见下表1,最后一列Default表示参数默认值,其中Repeat属性中的inf表示顺序读取文件直至文件末尾,映射的内存数据可通过m.Data属性来访问。
表1. Matlab memmapfile参数列表
调用示例:
首先创建一个5000*1维的double数组并保存,gallery是一个maltab测试函数,返回给定参数的测试数组。
randData = gallery('uniformdata', [5000, 1], 0, 'double'); fid = fopen('records.dat','w'); fwrite(fid, randData, 'double'); fclose(fid);
Example 1 创建默认内存映射文件
m = memmapfile('records.dat');
Example 2 创建指定参数的内存映射文件
设置offset、Format和Writeble属性,,注意最后得到了一个9744*1的uint32数组,总共是38976字节,加上offset刚好等于5000个double数组的总字节数。
m = memmapfile('records.dat', ... 'Offset', 1024, ... 'Format', 'uint32', ... 'Writable', true);
Type the object name to see the current settings for all properties:
m = Filename: 'd:\matlab\records.dat' Writable: true Offset: 1024 Format: 'uint32' Repeat: Inf Data: 9744x1 uint32 array
Example 3 映射对象
将record.dat文件映射成对象,该对象拥有一个4*10*8 uint32数组成员,变量名为x,,可以通过m.Data(*).x进行访问,*表示index.
m = memmapfile('records.dat', ... 'Offset', 1024, ... 'Format', {'uint32' [4 10 18] 'x'}); A = m.Data(1).x; whos A Name Size Bytes Class A 4x10x18 2880 uint32 array
Example 4 映射复杂对象
复杂对象拥有model,serialno,expenses三个属性,读取1000次。
m = memmapfile('records.dat', ... 'Format', { ... 'int16' [2 2] 'model'; ... 'uint32' [1 1] 'serialno'; ... 'single' [1 3] 'expenses'}, ... 'Repeat', 1000);
[1] Matlab MemoryMapped File