将2个XML与文档函数连接起来非常慢

时间:2013-11-08 15:19:46

标签: xslt xslt-1.0 talend

我有XML需要加入ID

XML输入(93 Mb)

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <Partner>
      <ID>186561</ID>
   </Partner>
   ...
<root>

XML:fuzzymatched.xml(40 Mb)

<?xml version="1.0" standalone="yes"?>
<root>
   <Partner>
    <ID>186561</ID>
    <FUZZYMATCH>71</FUZZYMATCH>
  </Partner>
  ...
<root>

当我使用以下XSLT加入这些文件时,它非常慢。它似乎每次都打开大文件?!有更好的解决方案吗?或者我做错了什么。 我使用Talend Open Studio的XSLT引擎

XSLT文件

<!-- ********************************************* -->
<!-- fuzzymatch_joiner.xsl : -->
<!-- ********************************************* -->
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

<xsl:variable name="vPartners" select="document('file:///c:/temp/fuzzymatched.xml')/root" />

<xsl:template match="root">
    <xsl:copy>
          <xsl:apply-templates select="Partner"></xsl:apply-templates>          
        </xsl:copy>
</xsl:template>
<!-- ********************************************* -->

<xsl:template match="Partner">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"></xsl:apply-templates>
        <xsl:copy-of select="$vPartners/Partner[ID = current()/ID]/FUZZYMATCH"/>
    </xsl:copy>
</xsl:template>
<!-- ********************************************* -->

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
</xsl:template>
<!-- ********************************************* -->

 </xsl:stylesheet>

2 个答案:

答案 0 :(得分:4)

由于XML文件的大小,您需要更改默认设置的解析器(DOM)并使用SAX解析器。

在tFileInputXML组件上,选择高级参数,然后选择 SAX解析器(标记为“内存耗尽”,如果我记得的话)。 xml处理应该快得多。

答案 1 :(得分:2)

首先,您一定要使用密钥(<xsl:key>key())来索引fuzzymatched.xml中的ID,以加快ID查找速度。这应该会产生巨大的差异。

如果这还不够......我对Talend了解不多,但我会尝试使用优秀的XSLT处理器(如Saxon)进行相同的转换,并了解性能如何比较。 XSLT处理器不必每次都重新打开document()引用的文件。

您是否可以在Talend中自由使用其他处理器?

XSLT 3.0(仍处于工作草案状态)提供对流的支持,这将减少输入XML的内存需求,并可加快速度。撒克逊人支持它。

但我认为只使用key()会为你加快速度。