Say*_*tan 10 python arrays numpy process multiprocessing
我正按顺序在3个不同的numpy 2D数组上执行一些大型计算.阵列很大,每个25000x25000.每次计算都需要很长时间,所以我决定在服务器上的3个CPU内核上并行运行其中的3个.我遵循标准的多处理指南并创建了2个进程和一个worker函数.两个计算正在通过这两个进程运行,第三个计算在本地运行而没有单独的进程.我传递巨大的数组作为过程的参数,如:
p1 = Process(target = Worker, args = (queue1, array1, ...)) # Some other params also going
p2 = Process(target = Worker, args = (queue2, array2, ...)) # Some other params also going
Run Code Online (Sandbox Code Playgroud)
Worker函数在队列中附加的列表中发回两个numpy向量(1D数组),如:
queue.put([v1, v2])
Run Code Online (Sandbox Code Playgroud)
我没用 multiprocessing.pool
但令人惊讶的是,我没有得到加速,实际上运行速度慢了3倍.通过大型阵列需要时间吗?我无法弄清楚发生了什么.我应该使用共享内存对象而不是传递数组吗?
如果有人可以提供帮助,我将感激不尽.
谢谢.
我的问题似乎已经解决了。我正在使用一个 django 模块,在该模块中我调用了 multiprocessing.pool.map_async。我的工作函数是类本身内部的函数。这就是问题所在。多处理不能在另一个进程内调用同一类的函数,因为子进程不共享内存。因此,在子进程内部,没有该类的活动实例。可能这就是为什么它没有被调用的原因。据我了解。我从类中删除了该函数,并将其放在同一个文件中,但在类之外,就在类定义开始之前。有效。我也得到了适度的加速。还有一件事是,面临同样问题的人请不要读取大型数组并在进程之间传递。酸洗和反酸洗会花费很多时间,而且你不会加速而是减速。尝试读取子进程本身内部的数组。
如果可能的话请使用 numpy.memmap 数组,它们非常快。