为什么 SciPy 的加载垫在读取 200 MB 的 Matlab 结构体时会抛出内存错误



我使用以下代码尝试在 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:Usersmac389workspacenexUtilssrcqA.py", line 16, in <module>
data =loadmat(test_filename, struct_as_record=True)
  File "C:Python27libsite-packagesscipyiomatlabmio.py", line 175, in loadmat
matfile_dict = MR.get_variables(variable_names)
  File "C:Python27libsite-packagesscipyiomatlabmio5.py", line 272, in get_variables
hdr, next_position = self.read_var_header()
  File "C:Python27libsite-packagesscipyiomatlabmio5.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 的内存。我正在使用 SciPy 0.10.0 和 NumPy 1.6.1。更改"struct_as_record"字段不会执行任何操作。

如何加载字段为单元格数组的结构?

我找到了答案。

Loadmat 无法处理大量嵌套的结构。在我得到的数据集中,三个结构场,"波,神经元,contvars"是细胞阵列。该单元数组的每个成员都是一个结构。这些结构的某些字段本身就是单元数组。这些单元格数组有一个包含数据的字段。这种非标准的数据组织方式加上缺乏文档造成了问题。

我想这是一个警示故事,尽可能接近文本文件格式,如果你正在创建数据存储格式,如果你选择一种真正的非标准格式,请怜悯你的继任者并记录这个事实......

我认为由于解压缩的实现方式,它在Python中需要更多的内存。尝试在不压缩的情况下保存在 Matlab 中(通过使用 -v6 ,版本 6 格式没有压缩功能)。

最新更新