Как мне анализировать большие XML-файлы в Perl? - PullRequest
4 голосов
/ 03 декабря 2009

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

my $xml = new XML::Simple;

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

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

Ответы [ 3 ]

14 голосов
/ 03 декабря 2009

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

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

4 голосов
/ 17 января 2010

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

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

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

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

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

4 голосов
/ 03 декабря 2009

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

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

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

...