def content_generator(applications, dict):
for app in applications:
yield(app, dict[app])
with open('abc.pickle', 'r') as f:
very_large_dict = pickle.load(f)
all_applications = set(very_large_dict.keys())
pool = multiprocessing.Pool()
for result in pool.imap_unordered(func_process_application, content_generator(all_applications, very_large_dict)):
do some aggregation on result
我有一个非常庞大的字典,其键是字符串(应用程序名称),值是与应用程序相关的信息。由于应用程序是独立的,我想使用多进程并行处理它们。当字典不是很大时,并行化运作良好,但当字典太大时,所有Python进程都被杀死了。我使用
dmesg
检查了出了什么问题,并发现它们被杀死是因为机器没有足够的内存。在池进程运行时,我使用 top
发现它们都占用相同数量的驻留内存(RES),即全部为 3.4G。这让我感到困惑,因为似乎已经将整个字典复制到生成的进程中。我以为我已经打破了字典,并通过仅返回 dict[app]
而不是 dict
来传递与生成的进程相关的内容。您对我的错误有何想法?
fork()
创建的,因此它们在创建时会获得整个父进程地址空间的副本。这是“写时复制”,因此更像是“虚拟”副本而不是“真实”副本,但仍然...;-)首先,请尝试在创建大型数据结构之前创建您的Pool
。然后子进程将继承一个更小的地址空间。 - Tim Peterscontent_generator(all_applications, very_large_dict)
,这是一个生成器,每次产生一个(key, value)
对。该生成器在主进程中运行。 - Tim Peters