Marklogic xslt performance

时间:2015-11-04 20:28:16

标签: xslt marklogic marklogic-7

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

  1. XSLT使用xsl:result-document生成多个输出文件。 MarkLogic XSLT处理器将这些输出作为结果XML节点,因为它无法将这些文档物理地保存到文件系统。
  2. XSLT构建包含xml节点的变量,然后由其他模板调用处理。有时这些变量可以容纳大量的XML节点。
  3. 我已经对XSLT进行了一些分析,似乎构建变量似乎是执行中最耗时的部分。我想知道为什么会这样,为什么它在撒克逊处理器上运行得更快?

    非常感谢任何见解。

3 个答案:

答案 0 :(得分:2)

我的理解是,与文件系统相比,在数据库的上下文中难以或不可能实现一些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电话会有一些开销,所以可能会有一些问题,或者情况可能更糟。

答案 1 :(得分:0)

我在ML 7中遇到过与样式表类似的性能问题。想到它我有类似的样式表,就像你提到的那样,即保存节点序列的变量。似乎xslt不可能像xquery那样进行优化。如果您对样式表的性能不满意,我建议您将xslt转换为它的等效xquery。我做到了这一点并取得了大约1~1.5秒的性能提升。值得努力:)

答案 2 :(得分:0)

在我的情况下,似乎在模板匹配规则中使用fn:not()函数会导致性能降低。也许如果其他人遇到同样的问题,这可能是一个很好的起点。