# Große XML Datei mittels JDOM bearbeiten / einlesen



## paplo-g (6. Okt 2008)

Hallo ich habe ein kleines problem,

ich möchte eine ca 20 MB Grosse XML Datei einlesen und bekomme immer out of memory exeptions 


```
Idee:
   DataInputStream input = new DataInputStream(
                            new BufferedInputStream(
                            new FileInputStream("meine_xml.xml")));
    

    Document doc = new SAXBuilder().build(input);
```


```
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at org.jdom.ContentList.ensureCapacity(ContentList.java:363)
	at org.jdom.ContentList.add(ContentList.java:234)
	at org.jdom.ContentList.add(ContentList.java:131)
	at java.util.AbstractList.add(Unknown Source)
	at org.jdom.Element.addContent(Element.java:811)
	at org.jdom.DefaultJDOMFactory.addContent(DefaultJDOMFactory.java:180)
	at org.jdom.input.SAXHandler.startElement(SAXHandler.java:587)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
	at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
	at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:489)
	at org.jdom.input.SAXBuilder.build(SAXBuilder.java:807)
```

Hat jemand ne idee wie ich das mit so einer grossen Datei hin bekomme?


----------



## Sergeant_Pepper (6. Okt 2008)

Hallo,

es gibt den Java-Laufzeitparameter "Xmx". Der legt fest, wieviel Speicher die virtuelle Maschine maximal bekommt.
Beispiel-Verwendung: "-Xmx512M" (=maximal 512 MB RAM).
Der Default-Wert beträgt 64MB (glaube ich).


----------



## Landei (7. Okt 2008)

Muss es unbedingt JDOM sein? Einen SAX-Handler schreiben ist keine schwarze Kunst, und du kommst mit wesentlich weniger Speicher aus. Wenn du die ganze Struktur im Speicher brauchst, ist eine mit SAX manuell zusammengebastelte in der Regel auch wesentlich kleiner als so ein DOM-Klumpen.


----------



## paplo-g (8. Okt 2008)

nein es muss nich unbedingt jdom seien, jedoch habe ich ich das ganze mit einem saxphaser versucht, der mir just vor fun mal die ganzen tag namen in ein array schreibt, und das dauert bei der ganzen geschichte ca 45 sec.

Deshalb suche ich den schnellsten Weg das ganze mal einzulesen.


----------



## Gelöschtes Mitglied 5909 (8. Okt 2008)

ich würde die StAX empfehlen, damit wird das ganze gestreamt und brauch trotzdem wenig speicher

http://stax.codehaus.org/


----------



## paplo-g (8. Okt 2008)

StAX scheint auch recht interessant zu seien, jedoch stört es mich das der Pointer nur in einer Richtung laufen kann,...
(Nicht rückwärts) 
So bräuchte ich eine Möglichkeit die mir erlaubt falls ich die XML Struktur bereits kenne, an eine bestimmte Stelle im XML Dokument zu springen. Ist das möglich, wenn ja wie ?


----------



## Gelöschtes Mitglied 5909 (8. Okt 2008)

Bisher habe ich das noch nicht gebraucht, glaube aber das ist auch nicht möglich. Du könntest dir aber x XMLEvents in ner Queue merken und dann ggf zurückspringen (Wenn du nicht grad hunderte oder tausende events zurück musst - dann wirds wieder speicherintensiv)

Kannst dir das ganze ja nochmal anschauen. Mit sax ist das aber auch nicht möglich afaik und jdom hält halt den ganzen baum im speicher

http://java.sun.com/webservices/docs/1.6/tutorial/doc/


----------

