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