Упрощенная версия моей функции синтаксического анализа XML находится здесь:
import xml.etree.cElementTree as ET
def analyze(xml):
it = ET.iterparse(file(xml))
count = 0
for (ev, el) in it:
count += 1
print('count: {0}'.format(count))
Это приводит к нехватке памяти Python, что не имеет большого смысла. Единственное, что я на самом деле храню, это счетчик, целое число. Почему он это делает:
Видите это внезапное падение использования памяти и ЦП в конце? Это эффектный сбой Python. По крайней мере, это дает мне MemoryError
(в зависимости от того, что еще я делаю в цикле, это дает мне больше случайных ошибок, таких как IndexError
) и трассировку стека вместо segfault. Но почему он рушится?
.clear()
для каждого элемента, когда вы закончите с ним, чтобы сэкономить память. Предположительно это работает, потому что в противном случае cElementTree сохраняет в памяти ранее возвращенные значения. - person Wooble   schedule 08.10.2011lxml
; он имеет идентичную (AFAIK) функциональность, но намного эффективнее по памяти и времени. - person user   schedule 08.10.2011lxml
превосходитElementTree
, но неcElementTree
, когда дело доходит до синтаксического анализа. - person Aillyn   schedule 09.10.2011iterparse()
строит дерево. Удаление нежелательных элементов остается на усмотрение вызывающего абонента. - person John Machin   schedule 09.10.2011