Как мне анализировать большие файлы XML в Perl?

Создает ли чтение данных XML, как в следующем коде, дерево DOM в памяти?

my $xml = new XML::Simple;

my $data = $xml->XMLin($blast_output,ForceArray => 1);

Следует ли использовать для больших файлов XML парсер SAX с обработчиками и т. д.?


person Ashika Umanga Umagiliya    schedule 03.12.2009    source источник
comment
Что вы хотите сделать с файлом? Сколько нужно держать в памяти для будущих операций? Мы не можем сказать вам, что использовать, не зная, что вам конкретно нужно делать.   -  person brian d foy    schedule 03.12.2009
comment
В качестве точки данных я попытался использовать XML::Simple для анализа XML-дампа Wikimedia Commons, но это слишком много (на более старой настольной машине с Ubuntu).   -  person Anon Gordon    schedule 06.12.2009


Ответы (3)


Я бы сказал да обоим. Библиотека XML::Simple создаст все дерево в памяти, и оно будет кратно размеру файла. Для многих приложений, если ваш XML превышает 100 МБ или около того, будет практически невозможно полностью загрузить в память в Perl. Анализатор SAX — это способ получения «событий» или уведомлений при чтении файла и открытии или закрытии тегов.

В зависимости от ваших шаблонов использования парсер на основе SAX или DOM может быть быстрее: например, если вы пытаетесь обрабатывать только несколько узлов или каждый узел в большом файле, режим SAX, вероятно, лучше всего. Например, чтение большого RSS-канала и попытка проанализировать каждый элемент в нем.

С другой стороны, если вам нужно сопоставить одну часть файла с другой частью, синтаксический анализатор DOM или доступ через XPath будут иметь больше смысла — написание его «наизнанку», как требуется синтаксическому анализатору SAX, будет неуклюжий и хитрый.

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

У меня был хороший успех с XML::SAX::Machines для настройки синтаксического анализа SAX в perl - если вам нужно несколько фильтров и конвейеров, их легко настроить. Для более простых настроек (т.е. в 99% случаев) вам просто нужен один фильтр sax (посмотрите на XML::Filter::Base) и сообщите XML::SAX::Machines, чтобы он просто проанализировал файл (или прочитал из дескриптора файла), используя ваш фильтр. Вот подробная статья.

person Doug Treder    schedule 17.01.2010

Для больших XML-файлов можно использовать XML::LibXML в режиме DOM, если документ помещается в памяти, или в режиме извлечения (см. XML::LibXML::Reader) или XML::Twig (который я написал, поэтому я предвзят, но в целом он хорошо работает для файлов, которые слишком велики, чтобы поместиться в памяти).

Я не поклонник SAX, который сложен в использовании и на самом деле довольно медленный.

person mirod    schedule 03.12.2009
comment
Я использую XML::Twig для больших файлов - person Ivan Nevostruev; 03.12.2009
comment
Мне нравятся как XML::Twig, так и XML::LibXML::Reader, но я предпочитаю использовать последний, потому что он намного быстрее, чем Twig... - person Onlyjob; 25.08.2014

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

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

Боюсь, это все лошади для курсов

person Xetius    schedule 03.12.2009