2013-05-01 51 views
0

我想測試不同的解析器,當我嘗試解析70 MB xml文件時,我遇到DOM問題。錯誤是java.lang.OutOfMemoryError 我想我有體面的電腦,所以我不知道有問題。DOM中的java.lang.OutOfMemoryError

另一個問題。我使用秒錶來捕捉解析時間,但我想我把stopwatch.stop放在錯誤的地方。我想這假設是右後

Document document = builder.parse("file.xml"); 

我已經後把它放在for循環打印出所有節點

感謝

回答

2

如果您使用默認堆大小並解析大型XML文檔,則會出現常見問題。您將需要增加JVM的Heap大小。在執行程序時,添加參數「-Xmx1024m」(或-Xmx512m或任何你認爲你需要的東西,堆只會佔用儘可能多的內存,因爲它需要達到指定的點)到jvm命令。

例如:java -Xmx1024m -jar myprogram.jar

這也可以在不同的IDE的運行屬性設置。在eclipse中,它是應用程序運行配置的「VM參數」部分。

2

的解決方案取決於你有沒有收到這類型的java.lang.OutOfMemoryError。如果這是你需要將以下參數添加到JVM設置PermGen的一個PermGen space(在本例中,將設置爲300 MB):

-XX:MaxPermSize=300m 

如果是Java Heap Space添加此參數設置堆空間(本例中爲1 GB):

-Xmx1024m 
+0

我從來沒有在jvm中做過修改。怎麼做?在winwods命令行中使用java -Xmx1024m?因爲它給我使用錯誤 – ivanz 2013-05-01 20:19:31

2

此外,如果您要處理大型XML文檔,您可能需要嘗試不同的方法。決定性因素是您是否需要同時在內存中存儲整個文檔。爲了節省空間,您可以分開分析XML的各個部分。

這被稱爲流XML解析器。您將希望Google爲Java提供一些不同的流式XML解析器。我的第一件事是StAX,這是規範。常見的util是Apache Axiom

http://en.wikipedia.org/wiki/StAX

+0

我正在嘗試測試不同的解析器。我會和SAX和StAX一樣做 – ivanz 2013-05-01 20:27:55

+1

如果內存不是JAXB的問題。它內置在Java中並執行Java對象映射。 SAX已經過時和繁瑣。 – 2013-05-01 20:31:18

0

另外一個建議:你可能想看看ScaleDOM,這使得解析非常大的XML文件:https://github.com/whummer/scaleDOM

ScaleDOM有一個小的內存佔用,由於XML節點的延遲加載。它只保留內存中的一部分XML文檔,並在必要時從源文件重新加載節點。

相關問題