私は、Pythonスクリプトで12個のXMLファイル(30〜80メガバイトごと)をロードしています:)(でも、終了後に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代で実行されます。しかし、私はシェルからこれらのすべてを実行して、データを対話的に処理しています。最初の非並行バージョンが完成した後、Pythonのメモリ使用量は約1.73GBとなりました。同時実行後、メモリ使用量は2.57GBです。
私はマルチプロセッシングを初めて使用していますので、何か基本的なものを見逃してしまった場合は、私を許してください。しかし、プールを使用した後にメモリを失うというその他の問題は、私がやっているclose()を呼び出すことができないことを指しています。
PS - これが12のXMLファイルを読み込むための本当にダムな方法であれば、どうか言ってください。
私はその問題が 'マルチプロセッシング 'に関するもので、私には興味があります(アップフォートし、購読しています)。可能ならば 'lxml.etree'の使用を検討してください。私は、それぞれ20 MBのテストファイルを生成しました。テスト結果 'lxml/xml'(マルチプロセッシングなし):time - 1.47/27.95 sec;メモリ - 411/640 MB。 – reclosedev