Kevin Guerraの答えで述べたように、ElementTreeドキュメントの "root.clear()"戦略は、完全に解析されたルートの子のみを削除します。それらの子供が巨大な枝を固定している場合、それはあまり役に立ちません。
彼は理想的なソリューションに触れますが、一例であるので、ここで、任意のコードを投稿しませんでした:
element_stack = []
context = ET.iterparse(stream, events=('start', 'end'))
for event, elem in context:
if event == 'start':
element_stack.append(elem)
elif event == 'end':
element_stack.pop()
# see if elem is one of interest and do something with it here
if element_stack:
element_stack[-1].remove(elem)
del context
関心の要素はサブ要素を持っていません。終了タグが表示されるとすぐに削除されます。必要なのは要素のテキストまたは属性だけであればOKです。
要素の子孫に問い合わせる場合は、子孫の完全な分岐を作成する必要があります。このために、これらの要素の深さカウンタとして実装されたフラグを維持します。深さがゼロの場合は.remove()を呼び出してください:
element_stack = []
interesting_element_depth = 0
context = ET.iterparse(stream, events=('start', 'end'))
for event, elem in context:
if event == 'start':
element_stack.append(elem)
if elem.tag == 'foo':
interesting_element_depth += 1
elif event == 'end':
element_stack.pop()
if elem.tag == 'foo':
interesting_element_depth -= 1
# do something with elem and its descendants here
if element_stack and not interesting_element_depth:
element_stack[-1].remove(elem)
del context
「常に増加しています」を明確にしてください。上記をループで実行すると、メモリ使用量が爆発的に増加しますか?あるいは、すべてのオブジェクトが解放された後でさえ、これを一度実行した後に使用量が上がることを単に見ますか? – wberry
私は、上記のプログラムのメモリ使用量が一定に保たれることを期待しています。代わりに、単調増加を示します。 –
上記をループで実行しても、stdinを消費するだけなので、効果はありません。 –