gpt4 book ai didi

Python 3 Multiprocessing Pool 对于大变量来说很慢

转载 作者:太空宇宙 更新时间:2023-11-04 00:32:57 25 4
gpt4 key购买 nike

我在 Python 3 中使用多处理池时遇到了一个非常特殊的问题...请参阅下面的代码:

import multiprocessing as MP                                       

class c(object):
def __init__(self):
self.foo = ""

def a(self, b):
return b

def main(self):
with open("/path/to/2million/lines/file", "r") as f:
self.foo = f.readlines()

o = c()
o.main()
p = MP.Pool(5)
for r in p.imap(o.a, range(1,10)):
print(r)

如果我按原样执行这段代码,这是我极其缓慢的结果:

1
2
3
4
5
6
7
8
9

real 0m6.641s
user 0m7.256s
sys 0m1.824s

但是,如果我删除 o.main() 行,那么我的执行时间会快得多:

1
2
3
4
5
6
7
8
9

real 0m0.155s
user 0m0.048s
sys 0m0.004s

我的环境有足够的能力,而且我已经确定我没有遇到任何内存限制。我还用较小的文件对其进行了测试,执行时间更容易接受。有什么见解吗?

编辑:我删除了磁盘 IO 部分,而是创建了一个列表。我可以证明磁盘 IO 与问题无关...

for i in range(1,500000):
self.foo.append("foobar%d\n"%i)

real 0m1.763s user 0m1.944s sys 0m0.452s

for i in range(1,1000000):
self.foo.append("foobar%d\n"%i)
real 0m3.808s user 0m4.064s sys 0m1.016s

最佳答案

在底层,multiprocessing.Pool 使用 Pipe 将数据从父进程传输到 Pool worker。

当整个 o 对象被序列化为 Pickle 时,这会增加任务调度的隐藏成本。对象并通过操作系统管道传输。

这是为您安排的每项任务完成的(在您的示例中为 10 次)。如果您的文件大小为 10 Mb,则您将移动 100Mb 的数据。

根据multiprocessing Programming Guidelines :

As far as possible one should try to avoid shifting large amounts of data between processes.

加速逻辑的一种简单方法是计算文件中的行数,将它们分成相等的 block ,仅将行索引发送给工作进程并让它们打开文件, 寻找正确的行并处理数据。

关于Python 3 Multiprocessing Pool 对于大变量来说很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45155377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com