我们有 MATLAB mat 文件,每个文件大小约为 12 GB。
这些 mat 文件是 MATLAB 表。我们只想读取表中的一些行,但是对于 12 GB 的 mat 文件,我们必须忍受大约 10 分钟的加载时间。由于我们只想读取文件中的某些行,因此无需将其加载到 MATLAB 即可完成此操作。
matfile 命令会将完整文件加载到内存中:
m=matfile('my_big_fat_file.mat')
因此 lad 花费的时间与加载命令本身相同。
显然 matfile 的优点是使用以下方法在 my_big_fat 文件中快速保存各个变量:
m = matfile('my_big_fat_file.mat','Writable',true);
我的问题是加载整个文件以仅读取几个变量。
另一方面,MATLAB 数据存储命令似乎旨在处理 csv 或图像格式的数据。
非常感谢
最佳答案
使用matfile object 允许直接访问变量,而无需从内存加载整个文件。 保存文件时使用 -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.
关于matlab - 从大 mat 文件中读取变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49533297/