2016-06-06 10 views
0

ich diese Ausnahme bin immer wenn eine xml mit xslt Transformation:Grails XSLT-Transformation, OutOfMemoryError: Java Heap-Speicher

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) 

I Saxon-HE bin mit der Version 9.7.0-5

Mein Code :

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); 

Die Größe der XML-Datei beträgt ca. 100 MB. Gibt es eine Möglichkeit, wie ich dieses Problem vermeiden könnte? Gibt es etwas wie das Streaming der Eingabedatei? Gibt es eine Alternative zu Saxon? Ich brauche xslt 2.0 für meine Transformationen.

Mit freundlichen Grüßen, Peter

+1

Überprüfen Sie dies: https://stackoverflow.com/questions/19764275/java-lang-outofmemoryerror-while-transforming-xml-in-a-huge-verzeichnis –

Antwort

0

ein 100Mb Quelldokument Verarbeitung sollte durchaus möglich sein, ohne 3,0-Streaming XSLT greifen zu müssen. Stellen Sie nur sicher, dass Sie der Java VM genügend Speicher zugewiesen haben. Das Quelldokument benötigt in der Regel etwa das 5-fache der Roh-XML-Größe, hängt aber natürlich vom Detail ab. Aber wenn Sie mit -Xmx2g laufen, würde ich sicherlich nicht erwarten, dass dies fehlschlägt, wenn nicht etwas Ungewöhnliches vor sich geht.

Sobald die Größe 500MB erreicht, möchten Sie wahrscheinlich über die Verwendung von XSLT 3.0-Streaming nachdenken. Aber Sie haben nichts darüber gesagt, was die Transformation bewirkt, also könnte es sehr einfach sein, es könnte ziemlich schwierig sein, oder es könnte unmöglich sein, abhängig von der tatsächlichen Transformation, die durchgeführt werden soll.

Verwandte Themen