【发布时间】: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 中执行此操作。
标签: python matlab scipy mat-file bigdata