【问题标题】:Multiprocessing efficiency confusion多处理效率混乱
【发布时间】: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


【解决方案1】:

对于那些可能对此感到好奇的人,我想我已经弄清楚了(尽管这个答案不会是高度技术性的)。在 """ DO STUFF """ 中,我调用 statsmodels.x13.x13_arima_analysis() 这是 X13-Arima-SEATS 的 Python 包装器,它是美国人口普查局为季节性调整时间序列(如销售记录)创建的销售调整程序)。我的笔记本电脑(Windows 10)上只有一个包装器调用的 x13.exe 副本为了有机会使用 .exe - 所以在我们的服务器上,我的笔记本电脑会自动处理 I/O 问题。解决方案很简单 - 为每个进程创建一个具有唯一路径的 .exe,以使该程序比以前快 300 倍。

我不明白不同的操作系统如何处理多个进程查看同一个 .exe 的问题,但这是我的理论,在添加依赖于进程的路径时似乎得到了证实。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多