Marklogic xslt性能

我有一个XSLT,我正在通过xdmp:invoke()函数执行,并且我遇到很长的处理时间以查看任何结果(在某些情况下,在达到3600s的最大时间后完全超时).这个XSLT在Oxygen编辑器中大约在5秒内运行.我认为可能影响性能的一些领域:

> XSLT使用xsl:result-document生成多个输出文件. MarkLogic XSLT处理器将这些输出作为结果XML节点,因为它无法将这些文档物理地保存到文件系统.
> XSLT构建包含xml节点的变量,然后由其他模板调用处理.有时这些变量可以容纳大量的XML节点.

我已经对XSLT进行了一些分析,似乎构建变量似乎是执行中最耗时的部分.我想知道为什么会这样,为什么它在撒克逊处理器上运行得更快?

任何见解都非常感谢.

最佳答案 我的理解是,与文件系统相比,在数据库的上下文中难以或不可能实现一些XSLT性能优化.此外,Saxon是XSLT的行业领导者,并且速度明显快于市场上的任何产品,尽管这可能并不能解释您所描述的巨大差异.

您没有说明您正在运行哪个版本的MarkLogic,但8.0版本在XSLT性能方面做出了重大改进.我运行的一些简单测试表明,速度提高了3-4倍,具体取决于XSLT.

Windows上运行MarkLogic时,我遇到了一些罕见但严重的XSLT性能边缘情况. Linux和OSX版本似乎没有这个问题.当XSLT任务在多个线程上运行时,它也更加高度显着.

但是,可以使用xdmp:save将数据直接保存到文件系统而不是数据库.

除非您的XSLT涉及非常复杂的模板规则,否则我建议至少在XQuery中测试一些对性能敏感的XSLT逻辑.可以移植最慢的部分并将这些查询的结果传递给XSLT.它并不理想,但您可以在不重写XSLT的情况下实现可接受的性能.

另一个想法,如果问题只是多传递XSLT中的变量构造,就是将XSLT分解为多个XSLT,并从XQuery多次调用xdmp:xslt-invoke.但是,我知道进行xdmp:xslt-invoke调用有一些开销,所以它可能是一个清洗,或者可能更糟.

点赞