从大mat文件中读取变量

时间:2018-03-28 11:27:42

标签: matlab bigdata

我们有MATLAB mat文件,每个文件的大小约为12 GB。

这些mat文件是MATLAB表。我们只想读取表中的一些行,但是对于12 GB的mat文件,我们必须忍受大约10分钟的加载时间。由于我们只想读取文件中的某些行,因此无需将其加载到MATLAB即可。

matfile命令会将完整文件加载到内存中:

m=matfile('my_big_fat_file.mat')

因此将相同的时间作为加载命令本身。

显然matfile是好的是使用以下命令在my_big_fat文件中快速保存单个变量:

m = matfile('my_big_fat_file.mat','Writable',true);

我的问题是加载整个文件只读取几个变量。

另一方面,MATLAB数据存储区命令似乎旨在处理csv或图像格式的数据。

非常感谢

1 个答案:

答案 0 :(得分:3)

使用matfile对象可以直接访问变量,而无需从内存中加载整个文件。 保存文件时使用-7.3标志非常重要,以使部分变量读取有效。

从mat文件中读取一行变量

给定一个带有变量b的matfile对象matfileObj,你可以按如下方式读取b的第i行:

matFileObj = matfile('mFile.mat')
matFileObj.b(1,:);

将mat文件转换为v7.3

将现有的mat文件转换为高效的文件可以按如下方式完成:

load('m.mat');
save('m_v7_3.mat','-v7.3');

完整代码示例

%generating a mat file which contains 4 variables
a=1;
b=rand(3000,3000);
b(1,:) = 0; 
c=rand(3000,3000);
d=rand(3000,3000);
save('mFile.mat','-v7.3');

%acessing variables without loading the enitre structure 
tic
matFileObj = matfile('mFile.mat')
matFileObj.a;
matFileObj.b(i,:);
toc

%acessing variables regularly
tic 
S = load('mFile.mat');
S.a;
S.b(1,:);
toc

<强>结果

Elapsed time is 0.026882 seconds.
Elapsed time is 8.181252 seconds.