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

use*_*388 6 python matlab scipy bigdata mat-file

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

import scipy.io as sio
very_large = sio.loadmat('very_large.mat')
Run Code Online (Sandbox Code Playgroud)

我的笔记本电脑有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])
Run Code Online (Sandbox Code Playgroud)

生产:

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: []
Run Code Online (Sandbox Code Playgroud)

thc*_*ark 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 配合得很好。因此,如果您可以将数据读入框架,您可能就可以从那里用它做您想做的事情。

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

迷你咆哮

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

希望有帮助,

汤姆