Python 多处理比单处理花费更长的时间

标签 python arrays numpy process multiprocessing

我正在依次对 3 个不同的 numpy 二维数组执行一些大型计算。数组很大,每个 25000x25000。每次计算都需要花费大量时间,因此我决定在服务器的 3 个 CPU 内核上并行运行其中的 3 个。我遵循标准的多处理指南并创建 2 个进程和一个工作函数。两个计算通过 2 个进程运行,第三个计算在本地运行,没有单独的进程。我将巨大的数组作为进程的参数传递,例如:

p1 = Process(target = Worker, args = (queue1, array1, ...)) # Some other params also going

p2 = Process(target = Worker, args = (queue2, array2, ...)) # Some other params also going

Worker 函数在附加在队列中的列表中发回两个 numpy 向量(一维数组),例如:

queue.put([v1, v2])

我没有使用multiprocessing.pool

但令人惊讶的是我没有得到加速,它实际上运行速度慢了 3 倍。传递大数组需要时间吗?我无法弄清楚发生了什么。我应该使用共享内存对象而不是传递数组吗?

如果有人能提供帮助,我将不胜感激。

谢谢。

最佳答案

我的问题似乎已经解决了。我在调用 multiprocessing.pool.map_async 的内部使用了一个 django 模块。我的辅助函数是类本身内部的一个函数。这就是问题所在。多进程不能在另一个进程中调用同一类的函数,因为子进程不共享内存。所以在子进程内部没有该类的事件实例。可能这就是为什么它没有被调用的原因。据我了解。我从类中删除了该函数并将其放在同一个文件中,但在类之外,就在类定义开始之前。有效。我也得到了适度的加速。还有一件事是面临同样问题的人请不要读取大数组并在进程之间传递。 Pickling 和 Unpickling 会花费很多时间,而且你不会加速而是减速。尝试读取子进程本身内部的数组。

如果可能,请使用 numpy.memmap 数组,它们非常快。

关于Python 多处理比单处理花费更长的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19669160/

相关文章:

python请求处理某些http响应

Java数组反射: isArray vs. instanceof

python - 正确打印完整阵列

python - Tensorflow:Py_func 返回未知形状

python - 如何在 3D 空间中对一个点进行三角测量,给定 2 个图像中的坐标点和相机的外部值

python - 记录handleError()未拦截异常

Python 行读取大小(以字节为单位)

javascript - 如何映射两个数组来创建对象?

c - 如何检查数组中是否存在值或返回下一个空闲索引

python - 使用具有忽略子树机制的 Python 生成器进行预序遍历