将 2 个 XML 与文档功能连接起来非常慢



我有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>

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

在 tFileInputXML 组件上,选择高级参数并选择 SAX 解析器(如果我记得不错,标记为:"内存消耗不足")。XML 处理应该快得多。

首先,您绝对应该使用键(<xsl:key>key())来索引模糊匹配.xml中的 ID,以加快 ID 查找速度。这应该会产生巨大的影响。

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

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

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

但我认为仅仅使用key()应该会大大加快您的速度。

最新更新