如何在Python中加载大型.mat文件?

7

我有一个非常大的.mat文件(~ 1.3 GB),我正在尝试在我的Python代码(IPython笔记本)中加载它。我尝试了:

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

我的电脑有8GB内存,但会卡顿。我打开系统监视器,并发现内存消耗稳定增加到7GB,然后系统冻结。
我做错了什么?有什么建议或解决方法吗?
编辑:
有关数据的详细信息:以下是数据链接:http://ufldl.stanford.edu/housenumbers/ 我感兴趣的特定文件是extra_32x32.mat。 从描述中可以看出:加载.mat文件会创建2个变量:X是包含图像的4-D矩阵,y是类标签向量。要访问图像,X(:,:,:,i)给出第i个32x32 RGB图像,带有类标签y(i)。 例如,同一页面上较小的.mat文件(test_32x32.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或以某种方式缩小文件之外,没有太多可以做的。 - Kevin K.
3
你需要从mat文件中获取所有内容吗?如果不需要,可以通过指定variable_names=['varname1','varname2']来加载所需的变量。 - Jørgen
@ Jorgen。我确实需要所有变量(列)。但并非所有行。因此,也许有一种方法只选择前几行? - user42388
你提到的变量、列和行没有意义。我建议您给出文件内容的描述,就像MATLAB看到的那样(变量名称、类型(矩阵、单元、结构)和大小)。您可能还需要重新阅读loadmat文档。 - hpaulj
1
Matlab 可以通过创建 mat 文件接口 来潜在地加载文件的小块。但是,你可能需要编写一个 Python 包装器来实现这一点。 - zglin
显示剩余3条评论
1个回答

2
这个答案基于两个假设:
  • .mat 文件保存为 MAT 版本 7.3 (似乎与 hdf5 兼容,尽管 MathWorks 没有保证),或者可以通过直接写入 hdf5 格式 (使用 MATLAB 的 hdfwrite()) 进行保存。

  • 您能够在 Python 中导入和使用其他第三方软件包,即 pandas

方法

在这些假设的基础上,我会采用以下方法:

  1. 确保 .mat 文件以 hdf5 兼容的形式保存。这可能意味着使用 MATLAB 的 matfile() 进行转换,它不会将其全部加载到磁盘上,或者可以在具有更多 RAM 的计算机上进行一次性操作。

  2. 使用 pandas 将 hdf5 兼容的 .mat 文件的一部分读入数据框架。

  3. 在 Python 中使用数据框架进行进一步分析。

注意事项:

Pandas 数据框架通常与 numpy 和 scipy 非常兼容。因此,如果您可以将数据读入框架中,则可能能够从那里完成您想要的操作。

回答 这个 SO 问题 向您展示如何根据条件 (索引范围或某个逻辑条件,例如 WHERE something=somethingelse) 将 hdf5 数据文件的一部分 (pandas 数据框架) 读入内存中。

小抱怨

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

希望这有所帮助,

Tom


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接