python-使用多处理时拥有全局变量是否有效?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-使用多处理时拥有全局变量是否有效?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2081字,纯文字阅读大概需要3分钟。
内容图文
请考虑以下很酷的设置:
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,其中包含分块的主数据和相应的分片的从数据帧.不确定这是否是个好主意(以及如何正确执行)?
有任何想法吗?
谢谢!
解决方法:
令人惊讶的是,这取决于操作系统multiprocessing is implemented differently in Windows and Linux.
>在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))
内容总结
以上是互联网集市为您收集整理的python-使用多处理时拥有全局变量是否有效?全部内容,希望文章能够帮你解决python-使用多处理时拥有全局变量是否有效?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。