为什么使用scipy保存mat文件会导致文件大小比使用Matlab更大?

时间:2015-11-06 11:06:08

标签: python matlab scipy save

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

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

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

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

如果我使用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保存的文件。

2 个答案:

答案 0 :(得分:4)

查看docs

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

默认情况下,压缩功能处于关闭状态。在matlab中,压缩总是打开。

答案 1 :(得分:0)

当你设置do_compression = True时,有一个问题。对于大文件,当使用do_compression = True保存时,MATLAB无法加载。

在我的情况下,2 GB以下的mat文件没有任何问题从我的MATLAB(2017b)加载是否do_compression是True还是False,但当我加载2.25 GB mat文件时使用scipy.io.savemat保存( )使用压缩,MATLAB无法加载,即使我可以使用loadmat()从Python加载它。

在scipy.io.savemat手册中,format =' 5'的默认值,它最多支持MATLAB 7.2。它是它支持的最新版本。但是,在MATLAB的save()文档中,它表示需要使用' -v7.3'对于超过2GB的文件。我认为scipy的savemat无法正确保存的原因是因为它不支持大于2GB的mat文件的MATLAB 7.3版本。

希望scipy会有升级来解决这个问题。