जैसा कि केविन गुएरा द्वारा दिए गए उत्तर में बताया गया है, 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
ब्याज उसके उप-तत्व की जरूरत नहीं होगी के तत्व; जैसे ही उनके अंतिम टैग देखे गए थे उन्हें हटा दिया जाएगा। यह ठीक हो सकता है यदि आपको केवल तत्व के पाठ या विशेषताओं की आवश्यकता है।
यदि आप तत्व के वंशजों में पूछना चाहते हैं, तो आपको इसके लिए एक पूर्ण शाखा बनाने की आवश्यकता है। इसके लिए, उन तत्वों के लिए गहराई काउंटर के रूप में लागू ध्वज बनाए रखें। गहराई शून्य होने पर केवल .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
स्रोत
2017-06-12 22:26:27
कृपया "हमेशा बढ़ते" को स्पष्ट करें। यदि आप ऊपर एक लूप में करते हैं, तो स्मृति उपयोग विस्फोट करता है? या क्या आप केवल एक बार ऐसा करने के बाद उपयोग को देखते हैं, यहां तक कि सभी वस्तुओं को मुक्त करने के बाद भी? – wberry
मेरा मतलब है कि मैं ऊपर के कार्यक्रम के लिए स्मृति उपयोग की अपेक्षा करता हूं। इसके बजाय, यह एक monotic वृद्धि दिखाता है। –
ऊपर लूप में चल रहा है इसका कोई प्रभाव नहीं पड़ता है, क्योंकि यह सिर्फ stdin का उपभोग करेगा। –