什么原因会导致IOError:坏的消息长度

5

我正在使用Python脚本来操作和提取4D图像(功能性MRI扫描)中的信息。分析的一部分是使用multiprocessing包并行设置运行(对于每个受试者):

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.摆脱始终为零的体素(由于平均值的结果。没有区域将只包含零体素)
相比之下,引发上述错误的分析使用了大脑中所有体素的时间序列,从而得到了更大的相关矩阵。
我尝试通过遮罩每个主题文件来消除零体素,并且我没有收到任何“除以零”的错误,但这是我能想到的唯一两件事情。
另外,如上所述,处理的并行部分运行良好。可能在运行后抛出错误,可能是在重新映射结果期间发生的。
如果您能提供帮助,将不胜感激。此外,如果我应该提供其他详细信息,请告诉我。

1
这个问题还没有解决吗,还是你已经自己解决了? - Michael
1个回答

2
我遇到了同样的问题,当我从子进程返回的对象变得太大时(在我的情况下是数十千兆字节),我就会遇到这个问题。这些巨大的对象需要通过进程通信被pickle并发送回父进程,这可能是问题的原因。当然,即使我没有遇到这个错误,将数十千兆字节的数据移动是一个坏主意。因此,我的解决方案是改变程序的结构,以消除传递这样大的对象的需要。
你可以尝试使用共享内存。我没有太多的运气,因为我的对象非常复杂,不容易在共享内存中创建,需要大量的代码更改,但你的对象可能更容易管理。
另请参阅这个线程:Python多进程中的共享内存对象

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接