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

时间:2016-08-25 19:35:07

标签: python matlab scipy mat-file bigdata

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

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

我的8 GB内存笔记本电脑挂了。我保持系统监视器打开,看到内存消耗稳定增加到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: []

1 个答案:

答案 0 :(得分:1)

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

  • .mat文件保存为MAT版本7.3(which seems hdf5-compliant,虽然The MathWorks不保证它),或者可以通过直接写入hdf5格式保存(使用MATLAB&#39; hdfwrite())。

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

方法

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

  1. 确保.mat文件保存为hdf5兼容表单。这可能意味着使用MATLAB&#39; matfile()转换它,它不会将它全部加载到磁盘,或者可以在具有更多RAM的机器上一次性完成。

  2. 使用pandas将符合h​​df5标准的.mat文件的一部分读入数据框。

  3. 在python中使用数据框进行向前分析。

  4. 注意:

    Pandas数据框架通常与numpy和scipy配合得非常好。因此,如果您可以将数据读入一个框架,那么您可能可以从那里用它来做您想做的事情。

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

    迷你咆哮

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

    希望有所帮助,

    汤姆