@@ -160,8 +160,37 @@ some storage device. In such cases, blocking reads are unacceptable.
160160Because it's so flexible, :class: `XMLPullParser ` can be inconvenient to use for
161161simpler use-cases. If you don't mind your application blocking on reading XML
162162data but would still like to have incremental parsing capabilities, take a look
163- at :func: `iterparse `. It can be useful when you're reading a large XML document
164- and don't want to hold it wholly in memory.
163+ at :func: `iterparse `.
164+
165+ Note that both parsers build the tree incrementally: it is not freed
166+ incrementally, so every parsed element is kept until the whole document is
167+ read. To keep the memory usage low, get rid of the data which is not needed
168+ any more.
169+
170+ If the processed elements are large, it is enough to clear them.
171+ This works wherever they are in the tree,
172+ but the emptied elements are left in it::
173+
174+ for event, elem in ET.iterparse(source):
175+ if elem.tag == 'record':
176+ process(elem)
177+ elem.clear()
178+
179+ If an element has a large number of children,
180+ remove the processed children from it::
181+
182+ for event, elem in ET.iterparse(source, events=('start', 'end')):
183+ if event == 'start' and elem.tag == 'parent':
184+ parent = elem
185+ elif event == 'end' and elem.tag == 'child':
186+ process(elem)
187+ parent.remove(elem)
188+
189+ These examples are not universal,
190+ they only give an idea for two common cases.
191+ If you do not need a tree at all,
192+ parse with :class: `XMLParser ` and a custom target instead;
193+ it is not built then, and nothing has to be removed.
165194
166195Where *immediate * feedback through events is wanted, calling method
167196:meth: `XMLPullParser.flush ` can help reduce delay;
@@ -643,6 +672,10 @@ Functions
643672 for applications where blocking reads can't be made. For fully non-blocking
644673 parsing, see :class: `XMLPullParser `.
645674
675+ The tree is only built incrementally, it is not freed incrementally:
676+ every parsed element is kept until the whole document is read.
677+ See :ref: `elementtree-pull-parsing ` for how to keep the memory usage low.
678+
646679 .. note ::
647680
648681 :func: `iterparse ` only guarantees that it has seen the ">" character of a
0 commit comments