- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在依次对 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/
所以我的问题是: 为什么(以及如何避免)C# 中的 Is 运算符的生命周期比 if 中使用的更长? 例子: Animal a = new Cat(); if (a is Cat c) { Co
我遇到了这个问题,我已经尝试解决了很长一段时间。理想情况下,我希望 particles.js 的“生成框”向下延伸到页面底部(由 fullpage.js 计算的 7 x viewport),这样当使用
我想让一个 div(我的侧边栏)延伸到页面底部。我知道我需要添加“高度:100%;”为了做到这一点。 但是当我添加 height: 100%; 时,内容少于侧边栏的页面会降低侧边栏的高度,然后您就看不
只有我这么认为吗,还是在 SQL Server 2008 Management Studio 中扩展数据库列表比在 SQL Server 2005 Management Studio 中扩展数据库列表
我是一名优秀的程序员,十分优秀!