2010-09-14 5 views

ответ

5

Большинство библиотек DOM - как ElementTree - построят всю модель документа в ядре. Традиционно, когда ваша модель слишком велика, чтобы сразу вписаться в память, вам нужно использовать более ориентированный на поток парсер, например xml.sax.

Это часто бывает труднее, чем вы ожидаете, особенно когда используется для операций более высокого порядка, таких как работа со всем DOM одновременно.

Возможно ли, что ваш XML-документ является довольно простым, как

<entries> 
    <entry>...</entry> 
    <entry>...</entry> 
</entries> 

, который позволит вам работать на подмножествах данных в более ElementTree безопасным способом?

+0

спасибо. – zhangwf

2

только API, я видел, что может справиться с такого рода вещи на все pulldom:

http://docs.python.org/library/xml.dom.pulldom.html

Pulldom использует SAX API для создания частичных узлов DOM; потянув за определенные поддеревья в группу, а затем отбросив их, когда вы закончите, вы можете получить эффективность SAX памяти с разумностью использования DOM.

Это неполный API; когда я использовал его, мне пришлось изменить его, чтобы он полностью использовался, но он работает как основа. Я больше не использую его, поэтому не помню, что я должен был добавить; просто предварительное предупреждение.

Это очень медленно.

XML - очень плохой формат для обработки больших наборов данных. Если у вас есть какой-либо контроль над исходными данными, и если это имеет смысл для набора данных, вам намного лучше разбить данные на более мелкие куски, которые можно полностью проанализировать в памяти.

Другой вариант - использование SAX API, но они представляют собой серьезную боль, чтобы сделать что-то нетривиальное с помощью непосредственно.

11

Проверьте функцию iterparse(). Описание того, как вы можете использовать его для анализа очень больших документов, можно найти here.

+0

Функция iterparse() решит вашу проблему, я недавно проанализировал документ размером 1GB xml с помощью iterparse :) –

Смежные вопросы