быстрая проверка существования тега в большом XML с использованием python cElementTree - PullRequest
0 голосов
/ 07 марта 2020

У меня есть XML файлы размером от сотен мегабайт до десятков гигабайт, и я использую Python's cElementTree для их обработки. Из-за ограниченной памяти и низкой скорости я не хочу загружать все содержимое в память, используя метод et.parse, затем find или findall, чтобы определить, существует ли тег (на самом деле я не пробовал таким образом). Теперь я просто использую et.iterparse, чтобы перебрать все теги для достижения этой цели. В случае, если тег расположен близко к концу файла, это также может быть очень медленным. Интересно, существует ли лучший способ добиться этого и получить местоположение тега? Если я знаю верхний уровень (например, индекс), в котором находится тег, размер которого намного меньше, чем у других частей файла, возможно ли выполнить итерацию по тегу верхнего уровня, а затем нацелить эту часть на анализ? Я искал в Интернете, но, как ни странно, никаких связанных вопросов не опубликовано. Я что-то пропустил? Заранее спасибо.

1 Ответ

0 голосов
/ 07 марта 2020

Я решил эту проблему, прочитав блок файла за блоком вместо анализа файла с помощью cElementTree. Мои теги находятся близко к концу файла, поэтому в соответствии с этим ответом я считываю блок контекстов с указанным размером block_size за один раз с конца файла, используя file.seek и file.read методов и line = f.read(block_size), а затем просто используйте "<my_tag " in line (или более конкретное c имя тега, чтобы избежать неоднозначности), чтобы проверить, существует ли тег. Это намного быстрее, чем использовать iterparse до go через все теги.

...