【发布时间】:2012-06-18 23:13:43
【问题描述】:
我正在使用以下代码尝试在 Python 中加载 MAT 文件。我可以在 MATLAB 中毫无问题地加载它。
from scipy.io import loadmat
test_filename = 'test_data.mat' #This is a struct
data =loadmat(test_filename, struct_as_record=True)
运行该代码会产生此错误:
Traceback (most recent call last):
File "C:\Users\mac389\workspace\nexUtils\src\qA.py", line 16, in <module>
data =loadmat(test_filename, struct_as_record=True)
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio.py", line 175, in loadmat
matfile_dict = MR.get_variables(variable_names)
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 272, in get_variables
hdr, next_position = self.read_var_header()
File "C:\Python27\lib\site-packages\scipy\io\matlab\mio5.py", line 224, in read_var_header
stream = BytesIO(dcor.decompress(data))
MemoryError
作为参考,test_data.mat 是一个包含以下字段的结构体(来自 MATLAB 控制台):
version: 101
comment: 'molecular layer 4/17'
freq: 40000
tbeg: 0
tend: 1.3950e+003
events: {3x1 cell}
neurons: {50x1 cell}
waves: {102x1 cell}
contvars: {64x1 cell}
Test_data.mat 为 217 MB。我有 4 GB 的 RAM。我正在使用 SciPy 0.10.0 和 NumPy 1.6.1。更改 'struct_as_record' 字段没有任何作用。
如何加载字段为元胞数组的结构?
【问题讨论】:
-
您的内存不足。虽然文件可能只有 200MB,但内存需求可能会更大。
-
.mat 文件压缩了吗?你的 Python 进程是 32 位的吗?你的 MATLAB 进程是 64 位的吗?
-
@David:mat 文件在 matlab 的二进制格式之外没有进一步压缩。两个进程都是 32 位的。我的问题是为什么加载一个小文件会占用 Python 中的内存而不是 matlab 以及我可以做些什么来规避它。
-
@David 我认为,根据堆栈跟踪,loadmat 在读取结构字段名称时会卡住。这可能不仅仅是“文件太大的问题”。
标签: python matlab file-io scipy mat-file