python - 使用多处理时拥有全局变量是否有效?

标签 python pandas multiprocessing python-multiprocessing

请考虑这个很酷的设置:

from multiprocessing import Pool, cpu_count
import pandas as pd
import numpy as np

def helper(master_df):
    max_index = master_df['key'].max()
    min_index = master_df['key'].min()
    #note how slave is defined before running the multiprocessing
    return slave.iloc[min_index:max_index,]

from datetime import datetime

master = pd.DataFrame({'key': [1,2,3,4,5,6,7,8,9,10]})
slave = pd.DataFrame({'key': [1,2,3,4,5,6,7,8,9,10],
                      'value' : ['a','b','c','d','e','f','g','h','i','j']})

if __name__ == '__main__':
     startTime = datetime.now()
     p = Pool(cpu_count() - 1)
     ret_list = p.map(helper, [master.iloc[1:5,], master.iloc[5:10,]])
     print datetime.now() - startTime
     print ret_list

本质上,我在内存中有两个数据帧。

正如您在主多处理代码中所见,p.map 接收 master 数据帧的两个 block 作为参数。

然后,(我想)multiprocessing 生成的每个进程将访问 slave 数据帧并使用它(无需修改)。实际上,您可以在 helper 函数中看到,每个进程都会对 slave 数据帧进行切片,并对其进行一些计算。

我的问题是:在每个进程访问的全局命名空间中定义一个数据帧是否有效?我不确定在 RAM 利用率方面会发生什么(slave 是否在每个进程的内存中复制?)。这不是一个好主意,因为实际上 masterslave 都非常大。

我想另一种方法是发送一个 tuplep.map,它包含分块的 master 和相应的切片 slave 数据帧。不确定这是个好主意(以及如何正确地做到这一点)?

有什么想法吗? 谢谢!

最佳答案

这出人意料地取决于操作系统,如multiprocessing is implemented differently in Windows and Linux .

  • 在 Linux 中,进程是通过 fork 变体创建的,其中子进程最初与父进程共享相同的地址,然后执行 COW(写时复制) .在 Linux 下,我经常让子进程访问一个只读的全局 DataFrame,一切都很好(包括性能)。

  • 在 Windows 中,在幕后,显然,整个进程都在旋转,将 DataFrame 复制到它可能会导致性能下降(除非它完成的处理量大到可以忽略不计的成本) ,但我从未在 Windows 上使用过 Python,因此没有使用它的经验。

编辑

一个使用 joblib 的例子使用数据框:

import joblib
import pandas as pd

df = pd.DataFrame(dict(a=[1, 3], b=[2, 3]))

def foo(i, df):
    return df + i

from joblib import Parallel, delayed
Parallel(n_jobs=2)(delayed(foo)(i, df) for i in range(10))

您还可以将 df 用作全局变量:

def foo(i):
    return df + i

from joblib import Parallel, delayed
Parallel(n_jobs=2)(delayed(foo)(i) for i in range(10))

关于python - 使用多处理时拥有全局变量是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49842290/

相关文章:

python - 将 scikit-learn DecisionTreeClassifier.tree_.value 映射到预测类

python - 域名检测

python - 如何使用 tripit API 制作独立工具?

python组合26个不同时间戳和相同列的数据帧

python - 如何更改使用 Matplotlib 绘制的图形的大小?

c# - 并行复制文件和不并行复制文件是否应该有区别?

python - 在 python 中使用普通函数 f(x)

python - 将 groupby 操作的结果行插入到原始数据框中

python - 多进程池与 asyncio.run_in_executor

Python:使用多处理池时使用队列写入单个文件