Python - фильтрация очень больших файлов XML - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть несжатый дамп из Википедии ~ 75 ГБ (сжатый: ~ 16 ГБ). Я попытался использовать что-то вроде

from xml.etree.ElementTree import iterparse

for event, elem in iterparse('enwiki-latest-pages-articles-multistream.xml'):
    if elem.tag == "___":
        #do something
        elem.clear()

Ядро в конечном итоге умирает в Jupyter Notebook через некоторое время. Дело в том, что я не хочу, чтобы все данные в этом дампе (предположительно ~ 1000M строк) - я хочу отфильтровать их только для нескольких объектов. Но чтобы сделать это, я должен был прочитать это сначала правильно? Это, по-видимому, то, что заставляет ядро ​​d ie. Я просто хотел очень маленькое его подмножество и хотел посмотреть, есть ли способ выполнить sh эту фильтрацию в Jupyter, такую ​​как большой XML файл.

1 Ответ

3 голосов
/ 10 февраля 2020

Но чтобы сделать это, я должен был бы прочитать это сначала правильно?

На самом деле, нет.

Вообще говоря, есть два способа обработки XML данных. Один подход «читает все это в память», создавая структуру данных в памяти одновременно. Но другой подход, обычно называемый SAX, читает файл XML и вызывает «обработчики» в вашем коде в указанных точках. Файл может быть произвольно большим.

Существует также другая технология, называемая «выражения XPath». Это позволяет вам создать строку , которая сообщает ядру XPath, какие узлы вы хотите найти. Затем XPath возвращает вам список соответствующих узлов. Вы не должны «написать программу» (!), Чтобы получить нужные вам результаты, , пока XPath может выполнить эту работу за вас. (Я рекомендую использовать libxml2, который является стандартным бинарным движком для подобных вещей. См. Как использовать Xpath в Python? )

...