我们有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或图像格式的数据。
非常感谢答案 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.