为啥使用 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文件(使用scipy.io)

SciPy中两个模块:io 和misc

scipy学习之——io操作及其misc操作对图片的处理

如何将各种尺寸的数组的Python列表保存到mat文件[重复]

从使用 Scipy.io.loadmat 加载的 .mat 文件访问数组内容 - python

python 笔记:读取mat文件