Python sax в lxml для 80+ ГБ XML

Как бы вы прочитали файл XML, используя sax, и преобразовали его в элемент etree.iterparse lxml?

Чтобы дать общее представление о проблеме, я создал инструмент загрузки XML, используя lxml для XML-потока размером от 25 до 500 МБ, который необходимо принимать два раза в день, но необходимо выполнять один раз. время приема файла размером 60–100 ГБ.

Я решил использовать lxml на основе спецификаций, согласно которым размер узла не должен превышать 4–8 ГБ, что, как я думал, позволит считывать узел в память и очищать его по завершении.

Обзор, если код приведен ниже.

elements = etree.iterparse(
    self._source, events = ('end',)
)
for event, element in elements:
    finished = True
    if element.tag == 'Artist-Types':
        self.artist_types(element)

def artist_types(self, element):
    """
    Imports artist types

    :param list element: etree.Element
    :returns boolean:
    """
    self._log.info("Importing Artist types")
    count = 0
    for child in element:
        failed = False
        fields = self._getElementFields(child, (
            ('id', 'Id'),
            ('type_code', 'Type-Code'),
            ('created_date', 'Created-Date')
        ))
        if self._type is IMPORT_INC and has_artist_type(fields['id']):
            if update_artist_type(fields['id'], fields['type_code']):
                count = count + 1
            else:
                failed = True
        else:
            if create_artist_type(fields['type_code'],
                fields['created_date'], fields['id']):
                count = count + 1
            else:
                failed = True
        if failed:
            self._log.error("Failed to import artist type %s %s" %
                (fields['id'], fields['type_code'])
            )
    self._log.info("Imported %d Artist Types Records" % count)
    self._artist_type_count = count
    self._cleanup(element)
    del element

Дайте мне знать, если я могу добавить какие-либо пояснения.

11
задан Nick 21 March 2012 в 17:08
поделиться