【发布时间】:2018-03-27 16:07:01
【问题描述】:
我正在使用 Multiprocessing 包运行 Python 作业,这就是问题所在。当我在双核超线程笔记本电脑上使用 3 个处理器运行时,每个内核的 CPU 使用率都达到了 100%,没有问题。我还有一个 6 核超线程工作站,当我在那台机器上运行相同的脚本时,每个核心几乎不会中断 30%。有人可以解释这是为什么吗?我以为是 I/O,但如果是这种情况,那么我的笔记本电脑不应该 100% 使用,对吧?
下面的代码和简短的解释: MultiprocessingPoolWithState 是一个自定义类,它启动 N_Workers 工作人员并为每个工作人员提供一个数据帧的副本(这样 df 就不会通过线路传送到每个工作人员的每个操作)。 tups 是一个元组列表,用作 process_data() 执行的每个操作的切片标准。
下面是代码示例:
import multiprocessing as mp
config = dict()
N_Workers = mp.cpu_count-1
def process_data(tup):
global config
df = config['df']
id1 = tup[0]
id2 = tup[1]
df_want = df.loc[(df.col1 == id1) & (df.col2 == id2)]
""" DO STUFF """
return series_i_want
pool = MultiprocessingPoolWithState(n=N_Workers, state=df)
results = pool.map(process_data,tups)
我不确定任何人还需要哪些其他详细信息,所以我会添加我可以添加的内容(我不能提供自定义类,因为它不是我的而是同事的)。主要是我的笔记本电脑使用了 CPU,但我的工作站没有。
【问题讨论】:
-
您是否尝试过以超额订阅的核心运行?例如,如果您在 6 核机器上运行 12 个进程会发生什么?这会提高你的利用率吗?更重要的是,这会减少净运行时间吗?
-
如果您的笔记本电脑有 SSD 磁盘,而另一台机器有物理旋转磁盘,这可能会导致此顺序的差异 - 机械磁盘机器将受到影响文件系统的序列化操作的瓶颈。解决方法应该只是产生更多的工人。
-
@Richard 我已经启动了 11 个进程,因为它是超线程的,你是建议我启动 24 个进程还是什么? jsbueno 实际上我不确定这两种机器的架构,但我可以与我们的 IT 团队一起探索。
-
@jsbueno 好像都是SSD
-
@NicPayne:是的,我建议您尝试启动比您认为需要的更多的流程。
标签: python