我加載在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