为啥使用 scipy 保存 mat 文件会导致文件大小比使用 Matlab 大?
Posted
技术标签:
【中文标题】为啥使用 scipy 保存 mat 文件会导致文件大小比使用 Matlab 大?【英文标题】:Why does saving mat files with scipy result in larger file size than with Matlab?为什么使用 scipy 保存 mat 文件会导致文件大小比使用 Matlab 大? 【发布时间】:2016-02-07 12:26:59 【问题描述】:假设我从 Matlab 生成以下玩具数据集,并将其保存为 mat 文件:
>> arr = rand(100);
>> whos arr
Name Size Bytes Class Attributes
arr 100x100 80000 double
>> save('arr.mat', 'arr')
根据ls
命令的输出,保存的arr.mat
文件大小为75829 Bytes
。
如果我使用scipy.io.loadmat()
加载相同的文件并使用scipy.io.savemat()
再次保存:
arr = io.loadmat('arr.mat')
with open('arrscipy.mat', 'w') as f:
io.savemat(f, arr)
我得到一个大小相当不同的文件(~ 4KB 大):
$ ls -al
75829 Nov 6 11:52 arr.mat
80184 Nov 6 11:52 arrscipy.mat
我现在有两个包含相同数据的二进制 mat 文件。我的理解是二进制 mat 文件的大小取决于其包含的变量的大小,加上文件头的一些开销。但是这两个文件的大小有很大的不同。为什么是这样? Is it a data format problem?
我也对结构数组进行了尝试,结果相似:scipy 保存的 mat 文件比 Matlab 保存的文件大。
【问题讨论】:
【参考方案1】:看docs:
scipy.io.savemat(file_name, mdict, appendmat=True, format='5',
long_field_names=False, do_compression=False, oned_as='row')
压缩默认关闭。在 matlab 中压缩总是打开的。
【讨论】:
更好。现在 scipy 保存的 mat 文件比 matlab 保存的文件小:75602 Bytes
用于 scipy 与 do_compression=True
对比 75829 Bytes
用于 Matlab save('arr.mat', 'arr')
。您对这可能如何发生有答案吗?【参考方案2】:
设置 do_compression=True 时有一个问题。对于大文件,使用 do_compression=True 保存时,MATLAB 无法加载。
在我的情况下,无论 do_compression 是真还是假,从我的 MATLAB (2017b) 加载 2 GB 以下的 mat 文件都没有问题,但是当我加载使用 scipy.io.savemat() 保存的 2.25 GB mat 文件时压缩,MATLAB 无法加载,即使我可以使用 loadmat() 从 Python 加载它。
在 scipy.io.savemat 手册中,默认值 format = '5',最高支持 MATLAB 7.2。这是它支持的最新版本。然而,在 MATLAB 的 save() 文档中,它说需要使用“-v7.3”保存超过 2GB 的文件。我认为scipy的savemat无法正确保存的原因是它不支持大于2GB的mat文件的MATLAB 7.3版本。
希望 scipy 能够升级以解决此问题。
【讨论】:
MAT5 文件使用整数作为长度标头,因此每个根级变量的基本限制为 2GB。数据是否被压缩并不重要。如果 SciPy 在您尝试存储大于 2GB 的变量时没有抱怨,这听起来像是一个错误。 “新”的 MATLAB 7.3 格式是一种完全不同的格式,它“基于”HDF5,与 MAT5 版本无关。不幸的是,这不是一个简单的升级,但就我所知的未记录格式而言,需要完全不同的实现。 很高兴知道这个回购:github.com/yu4u/age-gender-estimation以上是关于为啥使用 scipy 保存 mat 文件会导致文件大小比使用 Matlab 大?的主要内容,如果未能解决你的问题,请参考以下文章
如何将各种尺寸的数组的Python列表保存到mat文件[重复]