Создает ли чтение данных XML, как в следующем коде, дерево DOM в памяти?
my $xml = new XML::Simple;
my $data = $xml->XMLin($blast_output,ForceArray => 1);
Следует ли использовать для больших файлов XML парсер SAX с обработчиками и т. д.?
Создает ли чтение данных XML, как в следующем коде, дерево DOM в памяти?
my $xml = new XML::Simple;
my $data = $xml->XMLin($blast_output,ForceArray => 1);
Следует ли использовать для больших файлов XML парсер SAX с обработчиками и т. д.?
Я бы сказал да обоим. Библиотека 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, чтобы он просто проанализировал файл (или прочитал из дескриптора файла), используя ваш фильтр. Вот подробная статья.
Для больших XML-файлов можно использовать XML::LibXML в режиме DOM, если документ помещается в памяти, или в режиме извлечения (см. XML::LibXML::Reader) или XML::Twig (который я написал, поэтому я предвзят, но в целом он хорошо работает для файлов, которые слишком велики, чтобы поместиться в памяти).
Я не поклонник SAX, который сложен в использовании и на самом деле довольно медленный.
XML::Twig
для больших файлов
- person Ivan Nevostruev; 03.12.2009
XML::Twig
, так и XML::LibXML::Reader
, но я предпочитаю использовать последний, потому что он намного быстрее, чем Twig...
- person Onlyjob; 25.08.2014
Я раньше не использовал модуль XML::Simple, но использовал документация создается простой хэш в памяти. Это не полное дерево DOM, но вполне может быть достаточно для ваших требований.
Для больших XML-файлов использование синтаксического анализатора SAX было бы быстрее и требовало меньшего объема памяти, но это снова зависело бы от ваших потребностей. Если вам просто нужно обрабатывать данные последовательно, используйте XML::SAX, вероятно, удовлетворит ваши потребности. Если вам нужно манипулировать всем вашим деревом, то, возможно, используйте что-то вроде XML ::LibXML будет лучше для вас.
Боюсь, это все лошади для курсов