2011-06-28 78 views
2

我試圖創建的測試文件中包含10個000 000節點:創建具有大量節點(10萬美元)的XML文件

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory 
      .newInstance(); 
    DocumentBuilder documentBuilder = documentBuilderFactory 
      .newDocumentBuilder(); 
    Document document = documentBuilder.newDocument(); 
    Element rootElement = document.createElement("root"); 
    document.appendChild(rootElement); 
    for (int i = 1; i <= 10000000; i++) { 
     Element em = document.createElement("ch"); 
     em.appendChild(document.createTextNode("ch_data")); 
     rootElement.appendChild(em); 
    } 
    TransformerFactory transformerFactory = TransformerFactory 
      .newInstance(); 
    Transformer transformer = transformerFactory.newTransformer(); 
    DOMSource source = new DOMSource(document); 
    StreamResult result = new StreamResult(new File("c:/file1.xml")); 
    transformer.transform(source, result); 

但收到的錯誤:

 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl. 
createElement(CoreDocumentImpl.java:620) 
    at main.CreatXMLFile.main(CreatXMLFile.java:27) 

是否存在另一個用於在Java中創建超過10萬個節點的XML文件的庫?

+0

出於好奇,你爲什麼要創建如此龐大的XML文件?假設每個節點將被存儲爲約60個字節,則該文件將超過600MB(這是decimail MB,而不是二進制MiB),這對於平面文件來說是巨大的尺寸。如果你打算在這個文件中存儲的東西不會是一個更好的解決方案的數據庫? –

回答

4

對於這樣的簡單文件:考慮編寫XML文件,而無需使用任何DOM或StAX的:

writeToFile("<root>\n"); 
for (int i = 0; i < 10000000; i++) { 
    writeToFile("<ch>" + getData(i) + "</ch>\n"); 
} 
writeToFile("</root>\n"); 

這一切 - 你只需要的是將一個字符串寫入文件的方法。還有一種獲取文本數據的方法。

+0

解決此問題的最佳方法。謝謝安德烈亞斯 –

5

使用StAX將XML寫入流中,以便整個文檔不需要駐留在內存中。

0

您可能會嘗試增加爲JVM分配的內存。

但是爲什麼你需要把整個文件放在內存中?如果沒有很好的理由,你不應該這樣做。

1

你可以嘗試使用SAX parserJDOM

DOM解析器創建一個基於XML data.In SAX的基於事件的系統的層次結構的內部樹,解析器不創建文檔的任何內部表示。相反,解析器在某些事件(由SAX規範定義)發生時調用處理函數。這些事件包括文檔的開始和結尾,查找文本節點,查找子元素以及打擊格式錯誤的元素。

如果您需要解析和處理巨大的XML文檔,SAX實現爲基於DOM的實現提供更多好處。