为什么使用scipy保存mat文件会比使用Matlab生成的文件更大?

9

假设我从Matlab生成了以下玩具数据集,并将其保存为mat文件:

>> arr = rand(100);
>> whos arr
  Name        Size             Bytes  Class     Attributes

  arr       100x100            80000  double
>> save('arr.mat', 'arr')

根据ls命令的输出,保存的arr.mat文件大小为75829字节

如果我使用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文件的大小取决于其包含变量的大小,再加上由于文件头而产生的一些开销。然而这两个文件的大小差异很大。为什么会这样?这是数据格式问题吗? 我也尝试了使用结构体数组,结果类似:用scipy保存的mat文件比用Matlab保存的文件更大。
2个回答

10

Look at the docs:

scipy.io.savemat(file_name, mdict, appendmat=True, format='5',
    long_field_names=False, do_compression=False, oned_as='row')

默认情况下,不启用压缩。在Matlab中,压缩始终处于开启状态。


2
更好的是,现在使用do_compression=True保存的scipy mat文件比使用Matlab save('arr.mat', 'arr')保存的文件要小:scipy的大小为75602字节,而Matlab的大小为75829字节。你有什么想法可以解释这是如何发生的吗? - JoErNanO

3
当您将do_compression设置为True时,有一个注意点。对于大文件,使用do_compression=True保存后,MATLAB无法加载。
在我的情况下,大小小于2 GB的mat文件不管do_compression是True还是False,都可以从我的MATLAB(2017b)中正常加载,但当我加载使用scipy.io.savemat()压缩保存的2.25 GB mat文件时,即使我可以使用loadmat()从Python中加载它,MATLAB也无法加载。
在scipy.io.savemat手册中,format的默认值为“5”,支持MATLAB 7.2及以下版本。这是它支持的最新版本。然而,在MATLAB的save()文档中,它说需要使用“-v7.3”保存超过2GB的文件。我认为scipy的savemat无法正确保存的原因是它不支持MATLAB 7.3版本用于大于2GB的mat文件。
希望scipy能进行升级以解决这个问题。

MAT5文件使用整数作为长度标头,因此每个根级变量的基本限制为2GB。数据是否被压缩似乎并不重要。如果您尝试存储大于2GB的变量时,SciPy没有抱怨,那么这听起来像是一个错误。 "新"的MATLAB 7.3格式是完全不同的格式,它是基于HDF5的,与MAT5版本无关。不幸的是,这不是一个简单的升级,而是需要一个完全不同的实现,这是我所知道的一个未经记录的格式。 - Florian Enner
对于这个repo来说,有些事情需要知道:https://github.com/yu4u/age-gender-estimation - mLstudent33

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接