我正試圖解析一個XML文件高達500 MB的Java。我試圖使用SAX,但它給了我這個錯誤 java.lang.OutOfMemoryError:Java堆空間 在com.sun.org.apache.xerces.internal.util.XMLStringBuffer.append(未知源) 你能幫我嗎? 非常感謝。 P.S.較小的XML文件,使用工作流API爲XML就好Big XML文件和OutOfMemoryError
2
A
回答
5
3
您可以嘗試通過指定例如增加Java堆大小就
java -Xmx1024M MyClass
在命令行(或什麼價值將適合您的文檔大小)。
11
很可能您沒有正確使用SAX,或者您的應用程序不適合流處理。
SAX的重點在於避免將整個XML結構保留在內存中,但這隻有在您可以在不保留很多上下文的情況下以小塊處理XML並且處理結果遠小於處理過的XML(因此它不會使用太多的內存),或者本身可以傳遞給收件人或連續寫入磁盤。
編輯:也有可能你只是有內存泄漏,即你堅持不再需要的數據,防止它被垃圾收集。如果使用任何列表,映射或集合來處理XML,請確保在開始下一個塊之前刪除在處理一個XML塊時添加到它們的任何內容。
2
的StAX的Java版本前6: http://stax.codehaus.org/
1
假設你有以下的XML結構:
<?xml version="1.0"?>
<list>
<item>
<name>Alpha</name>
<age>10</age>
</item>
<item>
<name>Beta</name>
<age>20</age>
</item>
<!-- many many items -->
</list>
而且你想獲得的所有<項目>小號
公共類Item { String name; 絃樂年齡; }
你的SAX處理程序將看起來像這樣
public class MyHandler extends DefaultHandler
{
Item current=null;
StringBuilder content=null;
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
if( name.equals("item")
{
current= new Item();
}
else if(name.equals("name") || name.equals("age"))
{
content= new StringBuilder();
}
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException
{
if(name.equals("item"))
{
//DO SOMETHING WITH current
System.out.println(current);
current=null;
}
else if(name.equals("name"))
{
current.name= content.toString();
}
else if(name.equals("age"))
{
current.age= content.toString();
}
content=null;
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
if(content!=null)
{
content.append(ch,start,length);
}
}
}
正如你所看到的,「內容」只記住了「年齡」和「名稱」標籤之間。
0
看看Apache Digester。
1
你可能想看看ScaleDOM,這使得解析非常大的XML文件:https://github.com/whummer/scaleDOM
ScaleDOM有一個小的內存佔用,由於XML節點的延遲加載。它只保留內存中的一部分XML文檔,並在必要時從源文件重新加載節點。
相關問題
- 1. 排序BIG數據XML文件
- 2. Android的OutOfMemoryError與XML
- 3. android.view.InflateException:二進制XML <Unknown>和OutOfMemoryError?
- 4. OutofMemoryError讀取大文件時
- 5. Android OutOfMemoryError - 加載JSON文件
- 6. 上傳文件丟失OutOfMemoryError
- 7. 在PHP中解析BIG XML
- 8. AbstractStringBuilder enlargeBuffer和OutOfMemoryError
- 9. Erlang和Big Numbers
- 10. 用metod JAVA讀取BIG文本文件
- 11. Junit輸出和OutOfMemoryError
- 12. Little-endian和Big-endian
- 13. HttpHandler和XML文件
- 14. Servlet和xml文件
- 15. XML和XSL文件
- 16. 分析csv文件時出現Android OutOfMemoryError
- 17. 閱讀大文件錯誤「outofmemoryerror」(java)
- 18. 的OutOfMemoryError加載時〜200MB的文件fodler
- 19. 通過HTTP上傳BIG文件
- 20. 查看BIG文件的標題位置
- 21. 通過DOM解析器編輯BIG XML
- 22. XML文件和文本文件!
- 23. OutOfMemoryError
- 24. OutOfMemoryError
- 25. 調用XML文件和SWF文件
- 26. C#和XML - 搜索XML文件
- 27. OutOfMemoryError和卸載類sun.reflect.GeneratedMethodAccessor
- 28. Delphi:使用Synopse Big Table保存文件的文件夾
- 29. Google App Engine和Google Big Query
- 30. Big-O和常數除
我對500MB xml文件中存儲的內容感興趣! – 2009-02-02 20:24:45
你的XML是否包含非常大的文本(數百萬字符,比如說)而不包含中介元素? – bendin 2009-02-02 20:39:17