sur*_*chs 5 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
Run Code Online (Sandbox Code Playgroud)
这些适用于不同类型的文件和不同类型的分析.对于一种特定类型的分析,我收到以下错误:
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
Run Code Online (Sandbox Code Playgroud)
我把它缩小到了失败的程度.并行进程显然执行OK(通过在我的脚本的不同阶段查看我的各种调试打印输出来确定),但随后在重新映射结果期间发生了故障.
我已搜索此错误消息但尚未找到任何解决方案.由于我的脚本适用于所有其他类型的分析,我想知道可能会发生什么.
不同的分析是或多或少的时间序列提取大脑中的体素(将大脑想象为3D矩阵,时间作为第四维度,矩阵元素称为体素).大脑中的任何一点都有每个时间点的激活值.然后,时间序列是给定体素随时间的所有激活值的向量.
然后我计算所有体素之间的相关系数(通过体素给出方形相关矩阵与维度体素)并返回所有相关系数的矢量(矩阵的下三角形)作为并行处理的输出.
现在对于没有抛出错误的所有分析,我平均多个体素(基于区域节点),然后使用该区域的平均时间序列 - 有效地做两件事:
相反,给出上述误差的分析使用大脑中的所有体素时间序列,从而产生更大的相关矩阵.
我试图通过屏蔽每个主题文件来摆脱零体素,而且,我没有得到任何"除零"错误,但这些是我能想到的唯一两件事.
而且,如上所述,处理的并行部分没有问题地贯穿.在运行之后抛出错误,可能是在重新映射结果期间.
任何帮助将不胜感激.另外,如果我需要提供更多详细信息,请告知我们.
当我从子进程返回的对象变得太大(在我的情况下为数十千兆字节)时,我也遇到了同样的问题。这些巨大的对象需要被腌制并通过进程通信发送回父进程,这可能是问题的原因。当然,即使我没有收到此错误,移动数十 GB 的数据也是一个坏主意。因此,我的解决方案是更改程序的结构,以消除传递如此大的对象的需要。
您可以做的一件事是使用Shared Memory。我在这方面运气不佳,因为我的对象非常复杂,并且在不进行大量代码更改的情况下不容易在共享内存中创建,但您的对象可能更容易管理。
另请参阅另一个线程:Python multiprocessing 中的共享内存对象。
| 归档时间: |
|
| 查看次数: |
2691 次 |
| 最近记录: |