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

Numpy Python中的并行性(I)大数据块,numpy,multiprocessing,ipython,Numpy,Multiprocessing,Ipython,我已经在线程和进程上苦干了一段时间,试图加快我在IPython的并行工作。我不确定我调用的函数有多少细节是有用的,所以这里有一个bash,但是询问您是否需要更多 我的函数的调用签名看起来像 def intersplit_array(ob,er,nl,m,mi,t,ti,dmax,n0=6,steps=50): 基本上,ob、er和nl是观察值的参数,m、mi、t、ti和dmax是表示模型的参数,用于比较观察值。(n0和steps是函数的固定数值参数。)函数循环通过m中的所有模型,并使用mi中的

我已经在线程和进程上苦干了一段时间,试图加快我在IPython的并行工作。我不确定我调用的函数有多少细节是有用的,所以这里有一个bash,但是询问您是否需要更多

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

def intersplit_array(ob,er,nl,m,mi,t,ti,dmax,n0=6,steps=50):
基本上,
ob
er
nl
是观察值的参数,
m
mi
t
ti
dmax
是表示模型的参数,用于比较观察值。(
n0
steps
是函数的固定数值参数。)函数循环通过
m
中的所有模型,并使用
mi
中的相关信息、
t
ti
dmax
计算该模型匹配的概率。请注意,
m
相当大:它是一个大约700000个22x3numpy阵列的列表
mi
dmax
的大小相似。如果相关的话,我的普通IPython实例使用了我16GB内存中大约25%的系统内存

我试着用两种方式将其并行化。首先,我尝试使用上面给出的
parallel\u map
函数。我打了电话

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))
,并提供正确答案。如果没有
并行部分,这只是将函数逐个应用于每个元素的结果。但这比使用单个内核要慢。我猜这与全局解释器锁有关

其次,我尝试使用
多处理
中的
。我初始化了一个池

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
线程thread-3中的异常: 回溯(最近一次呼叫最后一次): 文件“/usr/lib64/python2.7/threading.py”,第551行,在引导程序内部 self.run() 文件“/usr/lib64/python2.7/threading.py”,第504行,正在运行 自我目标(*自我参数,**自我参数) 文件“/usr/lib64/python2.7/multiprocessing/pool.py”,第319行,在任务处理中 放置(任务) PicklingError:无法pickle:属性查找\内置\函数失败
查看
top
,然后我看到了所有额外的
ipython
进程,每个进程显然占用了25%的RAM(这不可能,因为我仍然有4GB的空闲空间),并且使用了0%的CPU。我猜它什么也没做。我也不能用IPython。我试了一会儿Ctrl-C,但当我通过第300名游泳池工作人员时就放弃了。

它不是以交互方式工作的吗

多处理
由于分割进程的方式,交互效果不佳。这也是为什么您很难杀死它,因为它产生了很多进程。您必须跟踪主进程才能取消它

发件人:

注意
此软件包中的功能要求子模块可以导入
\uuuuu main\uuuu
模块。这一点在本文中有所涉及,但值得在此指出。这意味着一些示例(如
多处理.Pool
示例)在交互式解释器中不起作用。

如果您尝试这样做,它实际上会以半随机的方式输出交错的完整回溯,然后您可能不得不以某种方式停止主进程


最好的解决方案可能是从命令行将其作为脚本运行。或者,但我从未使用过它。

你能使用m=一个700000 x 22 x 3的numpy数组,并在intersplit_array()中对其应用矢量化的numpy操作吗?我尝试过,但IIRC给了我内存错误。我想我做的一些广播制作了太大的新阵列。这可能是一个设计缺陷,但我离开了它,因为直到最近速度才成为问题。如果中间数组太大;您可以在切片上执行计算,例如,每个大小为1000的700个切片。numpy数组应该在矢量化操作期间释放GIL,因此可以使用使用线程而不是进程的
多处理.dummy.Pool
。不知何故,在我搜索“python”和“parallel”等关键字的过程中,我没有找到我现在使用的iPython并行系统。所以谢谢你提到它!很高兴能帮上忙,沃里克。成功了吗?我还没试过。是的,在稍微修改一下函数调用之后,它就像炸弹一样工作。我现在唯一担心的是有时集群节点也会耗尽内存,但我现在正在研究这个问题。