用于转换大型XML文件的内存高效XSLT

时间:2015-05-02 05:31:06

标签: xml xslt out-of-memory xslt-1.0 xslt-2.0

此问题与a recent answer by michael.hor257k 有关,后者与an answer by Dimitre Novatchev 有关。

当在上面提到的答案中使用样式表(通过 michael.hor257k )时,对于大型XML(大约60MB,下面是样本XML),转换成功执行。

当尝试另一个样式表时,与michael.hor257k略有不同,并且旨在将元素(带有子sectPr)及其后续兄弟分组(直到下一个带有子{cibling元素的子元素{{ 1}}),递归地(即,将元素分组到输入XML的深度)。

示例输入XML:

sectPr

我试过的样式表:

<body>
    <p/>
    <p>
        <sectPr/>
    </p>
    <p/>
    <p/>
    <tbl/>
    <p>
        <sectPr/>
    </p>
    <p/>
</body>

出于好奇,我遇到了 OutOfMemoryError 转换大约60MB的XML。

我想知道,我认为我不理解michael.hor257k和Dimitre Novatchev提供的XSLT背后的技巧,它不会导致内存异常。

我的样式表与上面提到的OutOfMemoryError的答案之间有什么重大区别。如何更新样式表以提高内存效率。

1 个答案:

答案 0 :(得分:5)

Lingamurthy CS,

请添加您从原始解决方案中删除的<xsl:strip-space elements="*"/>声明。这将从源XML文档中剥离任何仅空白文本节点。

不剥离这些节点可能会显着增加节点数和保存它们的内存 - 在这种情况下,保存XML文档所需的内存几乎是保存XML文档所需内存的两倍剥离这些节点。

我运行你的转换确定,但是剥离的节点运行速度提高了20% - 在MS XslCompiledTransform上。

然后我运行了你的转换 - 一次发布在问题中,第二次添加<xsl:strip-space elements="*"/>与Saxon 9.1J - 因为它还显示了转换的内存消耗。两次运行都很成功。在第一种情况下,处理的节点数是9525004并使用340MB RAM。转换耗时5.3秒。在第二种情况下,使用了4336366215MB个节点的节点数。转换在5.06

进行