(I)Python中的并行性与大块数据

时间:2013-05-14 10:21:59

标签: numpy multiprocessing ipython

我一直在忙着使用线程和进程一段时间来尝试加速我在IPython中的并行工作。我不确定我调用的函数有多少细节是有用的,所以这里有一个bash但是问你是否需要更多。

我的函数的调用签名看起来像

def intersplit_array(ob,er,nl,m,mi,t,ti,dmax,n0=6,steps=50):

基本上,obernl是观察值的参数,mmit,{{1} }和ti是表示将与其进行比较的模型的参数。 (dmaxn0是函数的固定数值参数。)函数循环遍历steps中的所有模型,并使用m中的相关信息{{1} },mit计算此模型匹配的概率。请注意ti非常大:它是大约70万个22x3 NumPy数组的列表。 dmaxm的大小相似。如果相关,我的普通IPython实例使用mi中大约25%的系统内存:4GB的16GB内存。

我试图以两种方式将其并行化。首先,我尝试使用at the SciPy Cookbook上给出的dmax函数。我打了电话

top

运行,并提供正确的答案。如果没有parallel_map部分,这只是将函数逐个应用于每个元素的结果。但这比使用单核更慢。我想这与Global Interpreter Lock有关吗?

其次,我尝试使用P = parallel_map(lambda i: intersplit_array(ob,er,nl,m[i+1],mi[i:i+2],t[i+1],ti[i:i+2],dmax[i+1],range(1,len(m)-1)) 中的parallel_。我用

初始化了一个池
Pool

然后尝试用

调用我的函数
multiprocessing

首先,我收到错误。

p = multiprocessing.Pool(6)

看一下P = p.map(lambda i: intersplit_array(ob,er,nl,m[i+1],mi[i:i+2],t[i+1],ti[i:i+2],dmax[i+1],range(1,len(m)-1)) ,然后我会看到所有额外的Exception in thread Thread-3: Traceback (most recent call last): File "/usr/lib64/python2.7/threading.py", line 551, in __bootstrap_inner self.run() File "/usr/lib64/python2.7/threading.py", line 504, in run self.__target(*self.__args, **self.__kwargs) File "/usr/lib64/python2.7/multiprocessing/pool.py", line 319, in _handle_tasks put(task) PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed 进程,每个进程显然占用了25%的RAM(不可能是这样,因为我还是获得4GB免费)并使用0%CPU。我认为它没有做任何事情。我也不能使用IPython。我尝试了一段时间的Ctrl-C,但是一旦我通过第300名游泳池工作人员就放弃了。

1 个答案:

答案 0 :(得分:2)

它是否以交互方式 工作?

由于分割过程的方式,

multiprocessing无法以交互方式播放。这也是你杀死它的原因,因为它催生了这么多进程。您必须跟踪主进程才能取消它。

来自the documentation

  

注意
  此程序包中的功能要求__main__模块可由子项导入。 Programming guidelines 中对此进行了介绍,但值得指出。这意味着某些示例(例如multiprocessing.Pool示例)在交互式解释器中不起作用   ...
  如果您尝试这样做,它实际上将以半随机方式交错输出完整的回溯,然后您可能必须以某种方式停止主进程。

最好的解决方案可能是从命令行将其作为脚本运行。或者,IPython has its own system for parallel computing,但我从未使用它。