即使在close()后,multiprocessing.Pool依然泄漏内存
我在一个Python脚本中加载12个XML文件(每个文件大小在30到80MB之间):
import xml.etree.ElementTree as ET
files = ['1.xml', '2.xml', ..., '11.xml', '12.xml']
trees = [ET.parse(f) for f in files]
这个过程大约需要50秒。我会运行几次,所以我想试试用多进程来加快速度:
import multiprocessing
trees = [None] * len(files)
def _parse_(i):
return (i, ET.parse(files[i]))
def _save_((i, tree)):
trees[i] = tree
def concurrent_parse():
pool = multiprocessing.Pool()
for i in range(len(files)):
pool.apply_async(func=_parse_, args=(i,), callback=_save_)
pool.close()
pool.join()
现在这个过程只需要30秒,效果不错。不过,我都是从命令行运行这些,然后再交互式地处理数据。在第一次不使用并发的版本完成后,Python的内存使用量大约是1.73GB。而在使用并发的版本后,内存使用量达到了2.57GB。
我对使用多进程还很陌生,所以如果我遗漏了什么基础知识,请多多包涵。不过,关于使用Pool后内存泄漏的问题,大家都提到要调用close(),而我确实有这样做。
PS - 如果这是加载12个XML文件的一个很傻的方法,请随便说。
1 个回答
2
我不太确定这是不是内存泄漏,使用并行处理时需要更多的内存来同时保存所有文件。然后,Python可能会删除一些对象,但没有把内存还给操作系统,这样看起来就像Python使用的内存比实际需要的多。
那么,如果你多次运行concurrent_parse()会发生什么呢?如果内存使用量保持不变,那就不是内存泄漏。如果每次运行后内存使用量都在增加,那就可能有问题,你可能需要查看这个讨论,了解如何追踪内存泄漏 - Python内存泄漏。