为什么用 scipy 保存 mat 文件比用 Matlab 保存的文件大?

Why does saving mat files with scipy result in larger file size than with Matlab?

假设我从 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 保存的大。

看看 docs:

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

压缩默认关闭。在 matlab 中压缩总是打开的。

设置 do_compression=True 时有一个问题。对于大文件,使用 do_compression=True.

保存时 MATLAB 无法加载

就我而言,无论 do_compression 是真还是假,从我的 MATLAB (2017b) 加载 2 GB 以下的 mat 文件都没有任何问题,但是当我加载使用 [= 保存的 2.25 GB mat 文件时18=]() 使用压缩,MATLAB 无法加载,即使我可以使用 loadmat() 从 Python 加载它。

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

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