【问题标题】: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 保存的文件大。

【问题讨论】:

    标签: python matlab scipy save


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2012-04-19
    • 2020-04-12
    相关资源
    最近更新 更多