2016-06-06 2 views
0

XSLT와 XML 변환 할 때 나는이 예외를 얻고있다 : 나는 색슨-HE을 사용하고Grails의 XSLT 변환, OutOfMemoryError가 : Java 힙 공간

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) 

을, 버전 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이 필요합니다. 100Mb 이더넷 소스 문서를 처리

안부, 피터

+1

확인 : https://stackoverflow.com/questions/19764275/java-lang-outofmemoryerror-while-transforming-xml-in-a-huge-directory –

답변

0

3.0 스트리밍을 XSLT에 의지하지 않고 완벽하게 가능해야한다. Java VM에 충분한 메모리를 할당했는지 확인하십시오. 원본 문서는 일반적으로 원시 XML 크기의 약 5 배를 차지하지만 물론 세부 사항에 따라 다릅니다. 그러나 -Xmx2g를 사용하여 실행하는 경우, 이상한 일이 발생하지 않는 한이 작업이 실패 할 것이라고 저는 확신하지 못합니다.

크기가 500MB에 도달하면 XSLT 3.0 스트리밍 사용에 대해 생각하기 시작할 것입니다. 그러나 당신은 변형이 무엇을하고 있는지에 대해 아무 말도하지 않았기 때문에 수행이 실제적인 변형에 따라 매우 쉽거나 어려울 수도 있고 불가능할 수도 있습니다.

관련 문제