如何用Multiprocessing Pool返回最小元素且避免占用大量内存?
解决multiprocessing.Pool内存占用问题:仅返回最小元素
方法一:用imap_unordered实现生成器式结果迭代(对应你的方案二)
imap_unordered会在子进程完成任务后立即返回结果,不需要等待所有任务完成,也不会存储全部结果,完美匹配你的需求。因为你不在意执行顺序,这个方法比imap效率更高。
代码实现:
from multiprocessing import Pool def task(group): # 你的任务逻辑,返回(program, l) ... with Pool() as pool: shortest = None min_l = None # 逐个获取子进程返回的结果 for program, l in pool.imap_unordered(task, groups): if shortest is None or len(program) < len(shortest): shortest = program min_l = l
方法二:用回调函数实时更新最小值(接近你的方案一)
通过给apply_async设置回调函数,每个子进程完成任务后自动触发比较逻辑,主进程不需要主动循环,内存占用更低(连迭代器的临时存储都省了)。
代码实现:
from multiprocessing import Pool def task(group): # 你的任务逻辑,返回(program, l) ... def update_min(result): global shortest, min_l program, l = result if shortest is None or len(program) < len(shortest): shortest = program min_l = l if __name__ == "__main__": shortest = None min_l = None with Pool() as pool: # 批量提交任务,每个任务完成后调用update_min for group in groups: pool.apply_async(task, args=(group,), callback=update_min) pool.close() pool.join() # 等待所有任务完成
注意事项
imap_unordered返回结果的顺序和任务提交顺序无关,正好符合你不在意执行顺序的需求。- 回调函数方式中,
global变量是安全的,因为只有主进程执行回调逻辑,子进程不会修改这些变量。 - 两种方法都不会存储所有任务结果,内存占用始终保持在单个结果的大小级别,适合处理极大的
groups集合。
内容的提问来源于stack exchange,提问作者gXLg
相关产品推荐
相关产品推荐

