Grails Xslt Transformation,OutOfMemoryError:Java堆空间

时间:2016-06-06 13:10:29

标签: grails xslt saxon

使用xslt转换xml时出现此异常:

Caused by: java.lang.OutOfMemoryError: Java heap space
at net.sf.saxon.tree.tiny.TinyTree.condense(TinyTree.java:430)
at net.sf.saxon.tree.tiny.TinyBuilder.close(TinyBuilder.java:206)
at net.sf.saxon.event.ReceivingContentHandler.endDocument(ReceivingContentHandler.java:244)
at net.sf.saxon.event.Sender.sendSAXSource(Sender.java:449)
at net.sf.saxon.event.Sender.send(Sender.java:177)
at net.sf.saxon.Controller.makeSourceTree(Controller.java:1910)
at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:573)
at net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:185)
at com.lomnido.service.XsltTransformService.$tt__transform(XsltTransformService.groovy:27)

我正在使用Saxon-HE,版本9.7.0-5

我的代码:

 TransformerFactory factory = TransformerFactory.newInstance();

    StreamSource xsltStream = new StreamSource(xslt)
    factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);

    Transformer transformer = factory.newTransformer(xsltStream);

    StreamSource ins = new StreamSource(input);
    File tmp = File.createTempFile("test", "xslttransform")
    StreamResult out = new StreamResult(tmp);
    transformer.transform(ins, out);

xml文件的大小约为100MB。有什么办法可以避免这个问题吗?有没有像输入文件流?撒克逊人有替代品吗?我的转换需要xslt 2.0。

祝你好运, 彼得

1 个答案:

答案 0 :(得分:0)

处理100Mb源文档应该是完全可行的,而无需借助XSLT 3.0流。只需确保为Java VM分配了足够的内存。源文档通常占原始XML大小的5倍,但当然这取决于细节。但是如果你使用-Xmx2g运行,我当然不会指望这会失败,除非发生异常情况。

一旦大小达到500Mb,您可能想要开始考虑使用XSLT 3.0流式传输。但是你还没有说过转换正在做什么,所以它可能非常简单,可能相当困难,或者可能是不可能的,这取决于要执行的实际转换。