我加载在Python脚本12个XML文件(30-80MB每个):与multiprocessing.Pool内存泄露甚至收盘后()
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多岁,这是一个很好的改善。但是,我正在从shell运行所有这些,然后交互式地处理数据。在第一个非并发版本完成之后,Python的内存使用率降至1.73GB。并发之后,内存使用量为2.57GB。
我是使用多处理器的新手,所以请原谅我,如果我错过了一些基本的东西。但是使用Pool之后失去内存的所有其他问题都指向我正在执行的close()失败。
PS - 如果这是一种非常愚蠢的方式来加载12个XML文件,请随时这么说。
我明白这个问题是关于'multiprocessing',它对我很感兴趣(upvoted和订阅)。但是如果可以的话,请考虑使用'lxml.etree'。我有4个生成的测试文件,每个20 MB。测试结果'lxml/xml'(没有多重处理):时间 - 1.47/27.95秒;内存 - 411/640 MB。 – reclosedev 2012-01-08 14:29:28