2012-04-02 20 views
4

Ich bin irgendwie neu zu Groovy und ich versuche, eine (ziemlich) große XML-Datei (mehr als 1 GB) mit XmlSlurper zu lesen, die Wunder mit großen Dateien arbeiten soll zu der Tatsache, dass es nicht das gesamte DOM im Gedächtnis baut.Parsing (sehr) große XML-Dateien mit XmlSlurper

Trotzdem bekomme ich immer "OutOfMemoryError: Java Heap Space", was mich denken lässt, dass da offensichtlich etwas ist, was ich falsch mache. Ich habe versucht, die XMX-Einstellung zu erhöhen, aber ich würde das Problem lieber lösen, da ich später vielleicht noch größere Dateien bearbeiten muss. Hier

ist die Linie der Code, den ich verwendet:

def posts = new XmlSlurper().parse(new File("posts.xml")) 

Jeder Hinweis auf das, was falsch ist?

Vielen Dank im Voraus,

Jérémie.

+0

Diese Frage ist ähnlich: http://stackoverflow.com/questions/4104264/is-it-possible-to-parse-sub-trees-with-groovy-xmlslurper –

Antwort

8

Groovy XmlSlurper ist ein SAX-Parser, sondern lädt das gesamte Modell in den Speicher ...

OOM Ausnahmen zu vermeiden, müssen Sie wahrscheinlich entweder auf Ihr Gedächtnis Geld (wie Sie sagen, mit der -Xmx Einstellung), oder Sie können write your own SAX parser bekommen nur die Daten, die Sie benötigen, aus dem Dokument

+1

Nun, das erklärt es. Vielen Dank ! –

3

Ich bin ein bisschen spät zu dieser Party, aber ich habe das gleiche Problem auch.

Ich machte eine Proposition für die groovy-user-Mailingliste und schlug tatsächlich vor, XmlSlurper etwas hinzuzufügen, das wie das XML :: Twig perl-Modul aussieht.

def xpathSlurper = new XPathXmlSlurper2();  
def c = { twig, it ->  
    println it.text().trim(); 
    twig.purgeCurrent(); 
} 
xpathSlurper.setTwigRootHandler(xpath, c); 
def fdata = xpathSlurper.parse(new File("test.xml")); 

Ich habe den Beispielcode hier angehängt: http://groovy.329449.n5.nabble.com/first-step-toward-Xml-Twig-for-Groovy-groovy-util-XPathXmlSlurper2-groovy-td4923577.html

Ich hoffe, das hilft!

+0

Im Moment habe ich mein Problem gelöst, indem ich meinen eigenen SAX-Parser als tim_yates vorgeschlagen habe, aber da ich mich in Zukunft mit ähnlichen (und wahrscheinlich größeren) Datenmengen befassen muss, wäre ich froh, so etwas zu haben. Danke für das Aufzeigen! –