什么可能导致IOError:错误的消息长度

时间:2012-04-23 05:18:24

标签: python multiprocessing

我正在使用python脚本来操纵和提取4D图像(功能性MRI扫描)的信息。部分分析设置为使用多处理包并行运行(针对每个主题):

pool = Pool(processes=numberCores)
resultList = pool.map(SubjectProcesser, argList) # where arglist is the list of arguments passed to the process

这些适用于不同类型的文件和不同类型的分析。对于一种特定类型的分析,我收到以下错误:

Process PoolWorker-1:
Traceback (most recent call last):
File "/home2/user/epd/epd-7.2-2-rh5-x86_64/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
  self.run()
File "/home2/user/epd/epd-7.2-2-rh5-x86_64/lib/python2.7/multiprocessing/process.py", line 114, in run
  self._target(*self._args, **self._kwargs)
File "/home2/surchs/epd/epd-7.2-2-rh5-x86_64/lib/python2.7/multiprocessing/pool.py", line 99, in worker
  put((job, i, result))
File "/home2/user/epd/epd-7.2-2-rh5-x86_64/lib/python2.7/multiprocessing/queues.py", line 392, in put
  return send(obj)
IOError: bad message length

我把它缩小到失败的程度。并行进程显然执行正常(通过在我的脚本的不同阶段查看我的各种调试打印输出来确定),但随后在重新映射结果期间发生了失败。

我已搜索此错误消息但尚未找到任何解决方案。由于我的脚本适用于所有其他类型的分析,我想知道可能会发生什么。

有点关于分析,因为我猜这会引起问题

不同的分析或多或少是大脑中体素的时间序列提取(将大脑视为3D矩阵,时间为第四维,矩阵元素称为体素)。大脑中的任何一点都有每个时间点的激活值。然后,时间序列是给定体素随时间的所有激活值的向量。

然后我计算所有体素之间的相关系数(通过体素给出方形相关矩阵与维度体素)并返回所有相关系数的矢量(矩阵的下三角形)作为并行处理的输出。

现在对于没有抛出错误的所有分析,我平均多个体素(基于区域节点),然后使用该区域的平均时间序列 - 有效地做两件事:

  1. 大幅减少体素数量(到区域数量)
  2. 摆脱总是为零的体素(由于平均值。没有区域只包含零体素)
  3. 相反,给出上述误差的分析使用大脑中的所有体素时间序列,从而产生更大的相关矩阵。

    我试图通过屏蔽每个主题文件来摆脱零体素,而且,我没有得到任何“除零”错误,但这些是我能想到的唯一两件事。

    另外,如上所述,处理的并行部分没有问题地贯穿。运行后抛出错误,可能是在重新映射结果期间。

    非常感谢任何帮助。另外,如果我需要提供更多详细信息,请告知我们。

1 个答案:

答案 0 :(得分:2)

当我从子进程返回的对象变得太大(在我的情况下为几十千兆字节)时,我遇到了同样的问题。这些巨大的对象需要被腌制并通过进程通信发送回父进程,这可能是问题的原因。当然,即使我没有收到此错误,移动数十GB的数据也是一个坏主意。所以,我的解决方案是改变程序的结构,以消除传递这些大对象的需要。

您可以做的一件事是使用Shared Memory。我没有太多运气,因为我的对象非常复杂,并且在没有大量代码更改的情况下不容易在共享内存中创建,但是您的对象可能更容易管理。

另见另一个帖子:Shared-memory objects in python multiprocessing