这个问题与 michael.hor257k 最近的回答 有关,该回答又与 Dimitre Novatchev 的回答 有关。
当使用上述回答(由 michael.hor257k 提供)的样式表对一个大型 XML 进行转换(大约 60MB,下面提供了示例 XML),转换成功了。
当尝试另一个样式表时,它与 michael.hor257k 的略有不同,旨在递归地对元素进行分组(具有子元素
示例输入 XML:
当使用上述回答(由 michael.hor257k 提供)的样式表对一个大型 XML 进行转换(大约 60MB,下面提供了示例 XML),转换成功了。
当尝试另一个样式表时,它与 michael.hor257k 的略有不同,旨在递归地对元素进行分组(具有子元素
sectPr
)和它们的后继兄弟元素(直到下一个具有子元素 sectPr
的后继兄弟元素),即将元素分组到输入 XML 的深度。示例输入 XML:
<body>
<p/>
<p>
<sectPr/>
</p>
<p/>
<p/>
<tbl/>
<p>
<sectPr/>
</p>
<p/>
</body>
我尝试的样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="*[1] | *[sectPr]"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::*[1][not(sectPr)]"/>
</xsl:template>
<xsl:template match="*[sectPr]">
<myTag>
<xsl:copy>
<xsl:apply-templates select="*[1] | *[sectPr]"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::*[1][not(sectPr)]"/>
</myTag>
</xsl:template>
</xsl:stylesheet>
好奇心驱使我在处理大约60MB大小的XML时遇到了OutOfMemoryError错误。
我想知道,我似乎不明白michael.hor257k和Dimitre Novatchev提供的XSLT背后的诀窍,它们为什么不会导致内存异常。
我的样式表与上述答案之间的主要区别是什么导致我出现了OutOfMemoryError。如何更新样式表以提高内存效率。
java -Xmx2048m -jar MyProg.jar myXML.xml
?问题:您是否尝试查看JVisualVM中的不同使用模式?问题:您是否控制Java应用程序,以便可以尝试优化,例如clearDocumentPool()? - FoggyDay<xsl:strip-space elements="*"/>
声明,该声明已从原始解决方案中删除。这将从源XML文档中剥离任何仅包含空格的文本节点。不剥离这些节点可能会显著增加节点数和内存占用量--在您的情况下,与剥离这些节点相比,持有XML文档所需的内存将几乎增加一倍。我已成功运行了您的转换,但是在剥离节点后,它的运行速度提高了20%。您的计算机有多少GB的RAM? - Dimitre Novatchev<xsl:strip-space elements="*"/>
,使用Saxon 9.1J - 因为它还显示了转换的内存消耗。两次运行都成功了。在第一种情况下,处理的节点数为925004,使用了340MB RAM。转换花费了5.3秒。在第二种情况下,节点数为4336366,使用了215 MB RAM。转换运行时间为5.06秒。 - Dimitre Novatchev