Python multiprocessing多进程如何共享大型DataFrame提速计算
问题背景
程序核心业务逻辑如下:
- 现有一份CSV格式存储的大规模数据集,当前尺寸为12000×5000,未来将扩展至12000×50000
- 另有一个单独的12000×1行向量,程序需要计算该行向量与数据集中全部12000行数据的相关性,计算函数内部已内置部分优化逻辑用于提升计算效率
已尝试的多进程提速方案及问题
目标是使用multiprocessing模块为程序提速,先后测试了多种实现方案,均存在问题:
- 常规传参写法:逐行向工作函数传递数据集行数据,核心代码如下
实际运行效率反而下降30%,推测原因为累计需要向函数传递5000次长度为12000的行/数组,产生了极高的进程间传参开销。pool.apply_async(func, args=(single_row,df.loc[i].astype('float64'),)) for i in df.index] - 全局变量方案:考虑将DataFrame与目标行向量设置为全局变量,但开发环境为Windows,该方式会导致每个派生进程都重新加载生成完整的DataFrame副本,完全无法达到提速效果。
- 嵌套函数方案:将相关性计算函数嵌套在主函数内部,使其可以直接访问外层作用域的DataFrame对象,进程调用代码可简化为
该方式下计算速度提升了近3倍,但在获取计算结果时触发了pickling错误,经查阅资料得知pool.apply_async(func, args=(i,)) for i in df.index]multiprocessing不支持嵌套函数的序列化操作。 - 共享内存/Manager方案:
- 尝试使用
shared_memory模块实现共享内存功能,暂未取得预期效果 - 尝试使用
multiprocessing.Manager的Namespace方案,核心代码如下
经测试该方案会在每个进程内生成独立的数据集副本,反而导致运行速度大幅下降。mgr = Manager() ns = mgr.Namespace() ns.main_df = main_df
- 尝试使用
待咨询的问题
- 是否存在可行方案让所有进程共享大型DataFrame,或是有其他适配该计算场景的
multiprocessing提速方案? - 是否有方法可以绕过嵌套函数的pickling问题?
- 该场景逻辑简单且嵌套函数方案可实现3倍提速,如何实现无需每次向函数传递大体积参数即可正常获取计算结果的方案?
内容的提问来源于stack exchange,提问作者cocoagoat
相关产品推荐
相关产品推荐

