如何在 python 中加载大的 .mat 文件?

Posted

技术标签:

【中文标题】如何在 python 中加载大的 .mat 文件?【英文标题】:How to load large .mat files in python? 【发布时间】:2017-01-02 08:48:06 【问题描述】:

我有一个非常大的 .mat 文件(约 1.3 GB),我试图将其加载到我的 Python 代码(IPython 笔记本)中。我试过了:

import scipy.io as sio
very_large = sio.loadmat('very_large.mat')

我的 8 GB RAM 笔记本电脑挂了。我保持系统监视器打开,看到内存消耗稳步增加到 7 GB,然后系统冻结。

我做错了什么?有什么建议/解决方法吗?

编辑:

有关数据的更多详细信息:这是数据的链接:http://ufldl.stanford.edu/housenumbers/

我感兴趣的特定文件是 extra_32x32.mat。 根据描述:加载 .mat 文件会创建 2 个变量:X 是包含图像的 4-D 矩阵,y 是类标签的向量。为了访问图像,X(:,:,:,i) 给出第 i 个 32×32 RGB 图像,类标签为 y(i)。

例如,当以以下方式加载时,来自同一页面 (test_32x32.mat) 的较小 .mat 文件:

SVHN_full_test_data = sio.loadmat('test_32x32.mat')
print("\nData set = SVHN_full_test_data")
for key, value in SVHN_full_test_data.iteritems():
    print("Type of", key, ":", type(SVHN_full_test_data[key]))
if str(type(SVHN_full_test_data[key])) == "<type 'numpy.ndarray'>":
    print("Shape of", key, ":", SVHN_full_test_data[key].shape)
else:
    print("Content:", SVHN_full_test_data[key])

产生:

Data set = SVHN_full_test_data
Type of y : <type 'numpy.ndarray'>
Shape of y : (26032, 1)
Type of X : <type 'numpy.ndarray'>
Shape of X : (32, 32, 3, 26032)
Type of __version__ : <type 'str'>
Content: 1.0
Type of __header__ : <type 'str'>
Content: MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Mon Dec  5 21:18:15 2011
Type of __globals__ : <type 'list'>
Content: []

【问题讨论】:

您的内存不足。除了将内存扩展到 >8gb 或以某种方式缩小文件之外,您无能为力。 您需要mat 文件中的一切吗?如果否,请尝试通过指定variable_names = ['varname1', 'varname2'] 来加载所需的变量。 @约根。我确实需要所有变量(列)。但是不是所有的行。那么可能是一种只选择前几行的方法吗? Y我们提到的变量、列和行没有意义。我建议向我们提供文件内容的描述,如 MATLAB 所见(变量名称、类型(矩阵、单元格、结构)和大小。您可能还需要重新阅读 loadmat 文档。 Matlab 可以通过创建interface to a mat file 来加载文件的小块。不过,您可能必须编写一个包装器才能在 python 中执行此操作。 【参考方案1】:

这个答案取决于两个假设:

.mat 文件保存为 MAT 版本 7.3(which seems hdf5-compliant,尽管 MathWorks 并没有保证),或者可以通过直接写入 hdf5 格式保存(使用 MATLAB 的@987654322 @)。

您可以在python中导入和使用其他第三方包,即pandas。

方法

鉴于这些假设,我将使用的方法是:

    确保将 .mat 文件保存为与 hdf5 兼容的格式。这可能意味着使用 MATLAB 的 matfile() 对其进行转换,这不会将其全部加载到磁盘上,或者可以在具有更多 RAM 的机器上一次性完成。

    使用 pandas 将部分符合 hdf5 的 .mat 文件读入数据框。

    使用数据框在 python 中进行后续分析。

注意事项:

Pandas 数据框通常可以很好地与 numpy 和 scipy 配合使用。因此,如果您可以将数据读入一个框架,您就可以从那里做您想做的事情。

this SO question 的答案向您展示了如何根据条件(索引范围或某些逻辑条件,例如 WHERE something=somethingelse)一次仅将 hdf5 数据文件的一部分读入内存(pandas 数据帧) .

迷你咆哮

MATLAB 支持其最新版本 7.3 MAT 文件已有 12 年了,但仍然不使用它作为标准版本来保存(这是一个磁盘空间问题,v7.3 在某些情况下更大,但更通用使用) - 所以任何使用默认 MATLAB 设置的人都不会生成 v7.3 matfiles。 12 年过去了,我们有大量的磁盘空间,但这种事情仍然会导致问题。是时候升级你的默认标志了,MathWorks!!!!

希望对你有帮助,

汤姆

【讨论】:

以上是关于如何在 python 中加载大的 .mat 文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MATLAB 中加载大文件(~150MB)?

如何在 Qt 中从 txt 文件中加载大数据

如何在 R 中加载大数据? [复制]

如何在unity3d中加载大工程模型

在 Pandas 数据框中加载大表时,如何避免 EC2 中的内存错误?

在Android中加载大文本