Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Marklogic xslt性能_Xslt_Marklogic_Marklogic 7 - Fatal编程技术网

Marklogic xslt性能

Marklogic xslt性能,xslt,marklogic,marklogic-7,Xslt,Marklogic,Marklogic 7,我有一个XSLT,我正在通过xdmp:invoke()函数执行它,我正在运行很长的处理时间来查看任何结果(在某些情况下,在达到3600秒的最大超时时间后完全超时)。在Oxygen editor中,此XSLT大约在5秒内运行。我认为可能影响性能的一些方面: XSLT使用xsl:result-document生成多个输出文件。MarkLogic XSLT处理器将这些作为结果XML节点输出,因为它无法将这些文档物理保存到文件系统 XSLT构建包含xml节点的变量,然后由其他模板调用处理。有时,这些变量

我有一个XSLT,我正在通过
xdmp:invoke()
函数执行它,我正在运行很长的处理时间来查看任何结果(在某些情况下,在达到3600秒的最大超时时间后完全超时)。在Oxygen editor中,此XSLT大约在5秒内运行。我认为可能影响性能的一些方面:

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


    任何见解都值得赞赏。

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

    您不会说您正在运行哪个版本的MarkLogic,但8.0版在XSLT性能方面有了显著的改进。我运行的一些简单测试建议根据XSLT将速度提高3-4倍

    在Windows上运行MarkLogic时,我遇到了一些罕见但严重的XSLT性能优势案例。Linux和OSX版本似乎没有这个问题。当XSLT任务在多个线程上运行时,它也更加明显

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

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


    如果问题只是在多通道XSLT中构造变量,那么另一个想法是将XSLT分解为多个XSLT,并从XQuery多次调用
    xdmp:XSLT invoke
    。但是,我知道进行
    xdmp:xslt invoke
    调用会有一些开销,因此这可能是一次清洗,也可能更糟。

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

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

    感谢您的快速响应。对不起,我正在linux操作系统上运行Marklogic 7.0-4.1。很高兴知道8.0中有一些改进。很遗憾,我无法保存文档,因为xquery层使用结果对文档进行进一步处理。@SalH虽然这是一项模糊且可能耗时的任务,但我认为最好的办法是构建一个测试用例,并尝试分解XSLT逻辑,以更好地隔离您的问题,并查看是否有其他处理方法(在较小的XSLT部分中,或使用一些XQuery部分)性能更好。此外,有时如果您的任务是在内存中构建非常大的XML,通常有更好的方法来利用数据库。作为最后的手段,您可以将Saxon放在Web服务器后面,并通过ML进行HTTP调用。当前在linux服务器上运行Marklogic(Marklogic 7.0-4.1)谢谢你的建议。这似乎是我必须采取的路线。我已经用ML8测试了xslt,但是,我没有看到任何显著的改进,它仍然导致超时。它不太可能是
    fn:not
    导致性能问题,更可能是它内部的表达式。