Какой способ быстрее читать XML? - PullRequest
0 голосов
/ 14 декабря 2011

Я использую XSLT для чтения 300-мегабайтного XML-файла - мне нужно проверить содержимое некоторых тегов и на основании этого я должен напечатать другие элементы тегов в качестве вывода.минут) и, в конце концов, он завершается сообщением «Убито» и никаких других выводов.

Какой еще способ быстрее?Могу ли я прочитать его с помощью SAX парсера в Java?Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2011

Первый шаг состоит в том, чтобы определить, тратится ли время в анализаторе XML или в процессоре XSLT: попробуйте (а) преобразование, которое ничего не делает (<xsl:template match="/"/>), и (б) преобразование, которое копирует все (<xsl:template match="/"><xsl:copy-of select="."/></xsl:template>) и сравните результаты с фактическим преобразованием.

XSLT-процессоры сильно различаются, и, если это вообще возможно, вы должны попробовать несколько. Вам также может понадобиться поэкспериментировать с различными способами использования вашего процессора XSLT, например, некоторые имеют модель внутреннего дерева, которая, вероятно, будет гораздо более эффективной, чем использование DOM. Так что возвращайтесь сюда с подробной информацией о вашем процессоре и о том, как вы его используете.

Наконец, «долгое время» нам ничего не говорит. Скажите нам, сколько на самом деле это займет времени, и мы можем сказать вам, разумно ли это или что-то не так.

1 голос
/ 14 декабря 2011

Таблицу стилей XSLT можно превратить в машину состояний во многом так же, как это делает регулярное выражение (некоторые библиотеки для работы с XSLT имеют опцию «компиляции», позволяющую принять решение о затратах на это в сравнении с преимуществами наличиясделано).

Когда это сделано, это может быть очень быстро.Однако природа таблицы стилей повлияет на это.Если сопоставление с шаблоном таково, что все это может быть выполнено только в прямом направлении (или может быть внутренне переписано в такое, которое может), это будет намного быстрее, чем если бы что-то требовало сделать много шагов назад в документе.

Даже самая лучшая реализация, вероятно, будет медленнее, чем лучшая реализация с прямым синтаксическим анализом XML (будь то push, как SAX или pull).Однако, так же, как и в подходе XSLT, если анализатор только для пересылки должен удерживать много состояний о ранее обнаруженных элементах, чтобы он мог реагировать на некоторые элементы способом, который ссылается на эти предыдущие элементы, это может замедлить работузначительно.В конце концов вы попадаете в точку, когда подход DOM (для полного документа или для его поддеревьев) становится сопоставимым по скорости и, вероятно, более простым (поскольку обращение к ранее встречающимся элементам - это именно то, что DOM делает проще всего).

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

...