2

我有 XML 我需要在 ID 上加入

XML 输入 (93 Mb)

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

XML:模糊匹配.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>
4

2 回答 2

4

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

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

于 2013-11-08T17:23:19.407 回答
2

首先,您绝对应该使用键 ( <xsl:key>and key()) 来索引来自fuzzymatched.xml 的ID,以加快ID 查找。那应该有很大的不同。

如果这还不够……我对 Talend 了解不多,但我会尝试使用经过良好优化的 XSLT 处理器(如 Saxon)进行相同的转换,并查看性能比较。document()XSLT 处理器不应该每次都重新打开引用的文件。

您是否可以在 Talend 中自由使用不同的处理器?

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

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

于 2013-11-08T16:32:51.823 回答