python - 为什么 SciPy 的 loadmat 在读取 200 MB 的 Matlab 结构时抛出 MemoryError

标签 python matlab file-io scipy mat-file

我正在使用以下代码尝试在 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 的内存。我正在使用 SciPy 0.10.0 和 NumPy 1.6.1。更改“struct_as_record”字段没有任何作用。

如何加载字段为元胞数组的结构体?

最佳答案

我找到了答案。

Loadmat 无法处理大量嵌套结构。在给我的数据集中,结构字段中的三个“waves、neurons、contvars”是元胞数组。该元胞数组的每个成员都是一个结构。这些结构的某些字段本身就是元胞数组。这些元胞数组有一个包含数据的字段。这种组织数据的非标准方式加上缺乏文档造成了问题。

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

关于python - 为什么 SciPy 的 loadmat 在读取 200 MB 的 Matlab 结构时抛出 MemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11058199/

相关文章:

python - 两个图像的 OpenCV 'BackgroundSubtractorMOG2'

matlab - 连续数字 block 的开始/结束值

matlab - 如何使用 MATLAB 创建包含文本和图形的报告

java - 为什么 FileWriter 不创建新文件? FileNotFoundException异常

python - gunicorn 和 websockets

python - 避免从已抓取的页面中抓取数据

java - Python 中的 Hazelcast bean 序列化

matlab - 在 MATLAB 绘图中忽略 NaN?

arrays - Zsh:将文件中的行读入数组

file-io - 打开第 5 或 6 单元上的文件