如何解决Multiprocessing Pool fork 启动方法和大全局变量dataframe、geodataframe在每个进程中的深拷贝
问题定义:将非常大的地理数据框(或数据框)的实例共享给多个进程,用于复杂的逻辑处理但不将其返回给父级。数据框加载一次,并在整个脚本中保持不变。
我能够使用 set_start_method('fork')
(Linux 上的默认值)解决上述问题,但我阅读了它的警告,因此我尝试使用 set_start_method('spawn')
重新实现它,问题是内存很快填满,没有工作完成。
更具体地说,我可以在使用 16gb ram 时运行 4 个进程,但是切换到 spawn
32gb 是分配的,而没有实际产生任何进程。
我的问题是,在每个进程中深度复制数据帧时,使用 fork() 作为启动方法是否安全?请注意,我不直接修改共享数据帧(所有工作都在深拷贝上完成),也不希望它被返回。仅用于比较。我也无法将其拆分为块,因为比较是使用随机出现的文件进行的。
例如,考虑以下简化代码:
import *
gdf = None
def set_global_gdf(_gdf):
global gdf
gdf = _gdf
def foo(path,args):
# Load global values
global gdf
# Does this make it safe?!
_gdf = gdf.copy(deep=True)
# complex logic with _gdf
...
return True
if __name__ == '__main__':
# Uncomment to enable
# freeze_support()
# set_start_method('spawn')
# Load gdf or df
gdf = ..
# Pool instance
pool = Pool(4,maxtasksperchild=1,initializer=set_global_gdf,initargs=(gdf,))
processes = []
for file in Path('*').rglob('*.csv'):
p = pool.apply_async(foo,args(file,arg1),callback=..,error_callback=..)
processes.append(p)
pool.close()
pool.join()
编辑:foo() 中没有任何冲突,因为它针对不同的文件运行,它们唯一共享的是数据帧,这是深度复制的每一次。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。