Grails Xslt Transformation, OutOfMemoryError: Java heap space
Grails Xslt Transformation, OutOfMemoryError: Java heap space
我在使用 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。
此致,
彼得
在不借助 XSLT 3.0 流的情况下处理 100Mb 的源文档应该是完全可行的。只需确保为 Java VM 分配了足够的内存。源文件一般占原始XML大小的5倍左右,当然这要看细节。但是,如果您 运行 使用 -Xmx2g,我当然不会期望它会失败,除非发生异常情况。
一旦大小达到 500Mb,您可能确实想开始考虑使用 XSLT 3.0 流。但是您还没有说明转换在做什么,所以它可能非常容易,也可能相当困难,或者可能不可能,具体取决于要执行的实际转换。
我在使用 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。
此致, 彼得
在不借助 XSLT 3.0 流的情况下处理 100Mb 的源文档应该是完全可行的。只需确保为 Java VM 分配了足够的内存。源文件一般占原始XML大小的5倍左右,当然这要看细节。但是,如果您 运行 使用 -Xmx2g,我当然不会期望它会失败,除非发生异常情况。
一旦大小达到 500Mb,您可能确实想开始考虑使用 XSLT 3.0 流。但是您还没有说明转换在做什么,所以它可能非常容易,也可能相当困难,或者可能不可能,具体取决于要执行的实际转换。