我有一個巨大的XML文件高達1-2GB,顯然我無法一次解析整個文件,我不得不將它分解成幾部分,然後解析這些部分並對它們做任何事情。在Java中計算xml節點的最有效方法是什麼
如何計算某個節點的編號?所以我可以跟蹤需要分割多少部分文件。有沒有更好的方法來做到這一點?我向所有人開放的建議,謝謝
問題更新:
嗯,我沒有使用STAX,也許我使用它的邏輯是錯誤的,我解析的文件,然後對每個節點我正在獲取節點值並將其存儲在字符串構建器中。然後在另一種方法中,我通過stringbuilder並編輯輸出。然後我將該輸出寫入文件。我可以做不超過10000個這樣的對象。
這裏是例外,我得到:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.sun.org.apache.xerces.internal.util.NamespaceSupport.<init>(Unkno
wn Source)
at com.sun.xml.internal.stream.events.XMLEventAllocatorImpl.setNamespace
Context(Unknown Source)
at com.sun.xml.internal.stream.events.XMLEventAllocatorImpl.getXMLEvent(
Unknown Source)
at com.sun.xml.internal.stream.events.XMLEventAllocatorImpl.allocate(Unk
nown Source)
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Sour
ce)
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.bridge(Unk
nown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.StAXEvent2SAX.parse(Unkn
own Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
mIdentity(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
m(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transfor
m(Unknown Source)
其實我覺得我的整個做法是錯誤的,就是我其實是想XML文件轉換成CSV樣本。下面是我如何做到這一點至今:
- 讀/解析XML文件
- 對於每一個元素節點獲取文本節點值
- 打開流寫入到文件(臨時),爲n個節點,然後沖洗和關閉流
- 然後打開從溫度讀取另一個流,使用commons條utils的和一些其他的東西,以創造適當的CSV輸出,然後將其寫入csv文件
你是什麼意思「不超過10000個這樣的對象」? 你發現了什麼錯誤或異常? – 2010-07-20 11:16:39
STAX API不使用大量內存,但如果您自己的程序在STAX執行迭代時存儲大量數據,那麼這不是STAX的錯誤。你需要整理你自己的內存管理,而不是選擇一個不同的XML API。 – skaffman 2010-07-20 11:39:39
爲什麼你將這個值存儲在一個stringbuilder中,你爲什麼不能處理獨立的節點值? – josefx 2010-07-20 13:17:03