Производительность Marklogic xslt
У меня есть XSLT, который я выполняю через xdmp:invoke()
функции, и я сталкиваюсь с очень длительным временем обработки, чтобы увидеть любой результат (в некоторых случаях тайм-аут полностью после достижения максимального времени из 3600 с). Этот XSLT работает примерно через 5 секунд в редакторе кислорода. Я думаю, что некоторые области могут повлиять на производительность:
- XSLT создает несколько выходных файлов, используя
xsl:result-document
, Процессор MarkLogic XSLT выводит их как результирующие XML-узлы, поскольку он не может физически сохранять эти документы в файловой системе. - XSLT создает переменные, содержащие узлы xml, которые затем обрабатываются другими вызовами шаблона. Иногда эти переменные могут содержать большой набор узлов XML.
Я провел некоторое профилирование XSLT, и кажется, что создание переменных, кажется, является наиболее трудоемкой частью выполнения. Мне интересно, почему это так и почему он работает намного быстрее на процессоре саксонской?
Любое понимание очень ценится.
3 ответа
Насколько я понимаю, есть некоторые оптимизации производительности XSLT, которые сложно или невозможно реализовать в контексте базы данных по сравнению с файловой системой. Кроме того, Saxon является лидером в отрасли XSLT и работает намного быстрее, чем почти все на рынке, хотя это, вероятно, не учитывает большое расхождение, которое вы описываете.
Вы не говорите, какую версию MarkLogic вы используете, но версия 8.0 значительно улучшила производительность XSLT. Несколько простых тестов, которые я проводил, предлагали улучшить скорость в 3-4 раза, в зависимости от XSLT.
Я столкнулся с некоторыми редкими, но серьезными случаями снижения производительности для XSLT при запуске MarkLogic в Windows. Сборки Linux и OSX, похоже, не имеют этой проблемы. Это также намного более ярко выражено, когда задачи XSLT выполняются в нескольких потоках.
Однако можно сохранять данные непосредственно в файловую систему вместо базы данных, используя xdmp:save
,
Если ваши XSLT не содержат очень сложных шаблонных правил, я бы рекомендовал по крайней мере протестировать некоторые чувствительные к производительности логики XSLT в XQuery. Может быть возможно портировать самые медленные части и передать результаты этих запросов в XSLT. Это не идеально, но вы можете достичь приемлемой производительности без переписывания XSLT.
Другая идея, если проблема заключается просто в создании переменных в многопроходном XSLT, состоит в том, чтобы разбить XSLT на несколько XSLT и сделать несколько вызовов xdmp:xslt-invoke
из XQuery. Тем не менее, я знаю, что есть некоторые накладные расходы на создание xdmp:xslt-invoke
звоните, так что это может быть стирка или еще хуже.
Я сталкивался с похожими проблемами производительности таблиц стилей в ML 7. Чтобы подумать об этом, у меня были такие же таблицы стилей, как и те, о которых вы упоминали, т.е. переменные, содержащие последовательность узлов. Кажется, что xslt нельзя оптимизировать так же, как и xquery. Если вас не устраивает производительность ваших таблиц стилей, я бы порекомендовал вам преобразовать xslt в эквивалентный xquery. Я сделал это и добился увеличения производительности примерно на 1~1,5 секунды. Это может стоить усилий:)
Ну, в моем случае, кажется, что с помощью fn:not()
Функция в правилах сопоставления шаблонов приводит к снижению производительности. Возможно, если кто-то еще испытывает ту же проблему, это может быть хорошей отправной точкой.