我們正在使用 saxon-ee 流處理大檔案。在這種情況下,檔案大小約為 1gb。轉換正在執行訂單查找資料并過濾匹配的 order_id。
轉換大約需要 1.5 小時。當我使用查找/過濾時。
如果我注釋掉查找并進行檢查,則只需 2 分鐘即可轉換完整的檔案。
這似乎是我使用查找方式和 if 條件的問題。請提供一些建議來解決此性能問題。示例輸入 XML
<?xml version="1.0" encoding="UTF-8"?>
<orders>
<order>
<guid>3079866431</guid>
<name>name1</name>
</order>
<order>
<guid>3079866431</guid>
<name>name2</name>
</order>
<order>
<guid>2583715475</guid>
<name>name3</name>
</order>
</orders>
lookup.xml 檔案內容
<?xml version="1.0"?><IndexControl><entry id="2521202370" status="true"/><entry id="2583715475" status="true"/></IndexControl>
帶有查找功能的 XSLT 模板需要 1.5 小時
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:mode streamable="yes"/>
<xsl:variable name="IndexLookup" select="document('https://test.com/lookup.xml')/IndexControl"/>
<xsl:template match="orders">
<xsl:element name="Batch">
<xsl:for-each select="order ! copy-of(.)">
<xsl:variable name="order_id" select="guid"/>
<xsl:if test="$IndexLookup/entry[@id=$order_id]/@status = 'true'">
<xsl:element name="Order">
<xsl:element name="Field">
<xsl:attribute name="name">id</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="guid"/>
</xsl:attribute>
</xsl:element>
<xsl:element name="Field">
<xsl:attribute name="name">name</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="name"/>
</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:if>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
沒有查找的 XSLT 需要 2 分鐘
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:mode streamable="yes"/>
<!-- <xsl:variable name="IndexLookup" select="document('https://test.com/lookup.xml')/IndexControl"/> -->
<xsl:template match="orders">
<xsl:element name="Batch">
<xsl:for-each select="order ! copy-of(.)">
<xsl:variable name="order_id" select="guid"/>
<!-- <xsl:if test="$IndexLookup/entry[@id=$order_id]/@status = 'true'"> -->
<xsl:element name="Order">
<xsl:element name="Field">
<xsl:attribute name="name">id</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="guid"/>
</xsl:attribute>
</xsl:element>
<xsl:element name="Field">
<xsl:attribute name="name">name</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="name"/>
</xsl:attribute>
</xsl:element>
</xsl:element>
<!-- </xsl:if> -->
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
uj5u.com熱心網友回復:
宣告一個密鑰<xsl:key name="lookup" match="IndexControl/entry" use="@id"/>,然后使用<xsl:for-each select="order ! copy-of(.)[key('lookup', guid, doc('https://test.com/lookup.xml'))/@status = 'true']">.
uj5u.com熱心網友回復:
我本來希望 Saxon-EE 優化器為查找運算式生成索引,如果有機會我會調查為什么沒有發生這種情況。但可以肯定的是,使用 Martin Honnen 建議的顯式密鑰應該可以修復它。
對于流式傳輸大檔案,我通常認為每 GB 大約 1 分鐘是一個合理的目標,但這顯然取決于您正在做的作業和運行它的機器。
順便說一句,它不會影響性能,但我確實發現這種代碼非常不可讀:
<xsl:element name="Field">
<xsl:attribute name="name">name</xsl:attribute>
<xsl:attribute name="value">
<xsl:value-of select="name"/>
</xsl:attribute>
</xsl:element>
什么時候可以改寫:
<Field name="name" value="{name}"/>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/471886.html
下一篇:移動XML不同的元素
