python全局变量在程序执行的全过程有效_python-使用多处理时拥有全局变量是否有效?...

请考虑以下很酷的设置:

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接收主数据帧的两个块作为参数.

然后,(我想)多处理产生的每个进程都将访问从属数据帧并使用它(无需修改).确实,您可以在助手函数中看到每个进程都会对从属数据帧进行切片并对其进行一些计算.

我的问题是:在每个进程访问的全局名称空间中定义一个数据框是否有效?我不确定在RAM利用率方面会发生什么(每个进程的从站是否在内存中重复?).那不是一个好主意,因为实际上主机和从机都很大.

我猜一个替代方法是将一个元组发送到p.map,其中包含分块的主数据和相应的分片的从数据帧.不确定这是否是个好主意(以及如何正确执行)?

有任何想法吗?

谢谢!

解决方法:

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

>在Windows的幕后,显然,整个过程都在旋转,并且将DataFrame复制到其中可能会降低性能(除非由它完成的处理足够大,以至于成本可以忽略不计),但是我还没有从来没有在Windows上使用过Python,所以没有经验.

编辑

将joblib与DataFrames结合使用的示例:

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))

标签:pandas,multiprocessing,python,python-multiprocessing

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值