Мне нужно обработать большой XML-файл (10 ГБ) с помощью Python. Из-за ограничений памяти я не могу загрузить все сразу, поэтому я узнал о библиотеке LXML и ее возможностях быстрого анализа.
На данный момент это моя установка:
Код: Выделить всё
context = etree.iterparse(input_file, events=("end",), tag="Product", huge_tree=True)
for event, elem in context:
self.extract_data(elem)
# Clear the element to free memory
elem.clear()
while elem.getprevious() is not None:
del elem.getparent()[0]
extract_data на данный момент является пустой функцией. При такой настройке при обработке XML-файла и элементов с тегом Product проблем с памятью не возникает. Проблема появляется после окончания элементов Product. В XML последняя строка огромна. Я даже не могу его прочитать, потому что Notepad++ не загружает последнюю строку. Он содержит кучу элементов «Service» в одной строке, и я думаю, что когда iterparse пытается проверить, есть ли тег Person, происходит что-то странное, и моя память увеличивается до 12 ГБ, пока скрипт не завершится.
Мой вопрос: как я могу решить эту проблему с памятью, не завершая преждевременно итератор, потому что в будущем мне тоже понадобятся служебные элементы.
Подробнее здесь:
https://stackoverflow.com/questions/788 ... using-lxml