проблема с памятью lxml - PullRequest
       5

проблема с памятью lxml

1 голос
/ 23 октября 2010

Я пытаюсь проанализировать большие XML-файлы (> 3 ГБ) следующим образом:

context = lxml.etree.iterparse(path)
for action,el in self.context:
    # do sth. with el

С iterparse я думал, что данные не полностью загружены в RAM, но согласно этой статье я ошибаюсь: http://www.ibm.com/developerworks/xml/library/x-hiperfparse/ (см. Листинг 4) Хотя, когда я применяю это решение к своему коду, некоторые элементы, очевидно, очищаются, которые до сих пор не были проанализированы (особенно дочерние элементы el).

Есть ли другое решение этой проблемы с памятью?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 24 октября 2010

Не забудьте использовать clear(), при необходимости также очищая корневой элемент, как объяснено здесь . Но, насколько я понимаю, вы уже делаете это, но, очевидно, вы пытаетесь получить доступ к контенту, который вы уже очистили или который еще не проанализирован. Было бы полезно, если бы вы могли предоставить что-то большее, чем «делай что-то с el». Вы используете getnext() или getprevious()? Выражения Xpath?

Другой вариант, если вы действительно не хотите строить дерево, это использовать целевой интерфейс синтаксического анализатора , который похож на SAX для lxml / etree (но проще).

1 голос
/ 24 октября 2010

Я решил эту проблему, выбрав тег непосредственно в контексте:

lxml.etree.iterparse(path, tag=tag)

, а не с дополнительным условием if.

Большое спасибо за вашу поддержку!

...