我有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>
答案 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()
会为你加快速度。