簡體   English   中英

創建具有大量節點(1000 萬)的 XML 文件

[英]Create XML file with large number of nodes (10 million)

我嘗試使用 10 000 000 個節點創建用於測試的文件,例如:

    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 000 000 個節點的 XML 文件的庫?

使用StAX將 XML 寫入 stream,這樣整個文檔就不需要駐留在 memory 中。

對於這樣的瑣碎文件:考慮在不使用任何 DOM 或 StAX 的情況下編寫 xml 文件:

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

僅此而已 - 您只需要一個將字符串寫入文件的方法。 以及獲取文本數據的方法。

您可以嘗試使用SAX 解析器JDOM

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

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

您可以嘗試增加為 JVM 分配的 memory。

但是為什么需要memory中的整個文件呢? 如果沒有很好的理由,你不應該這樣做。

您可以嘗試增加 JVM 的 memory 大小。

有幾種方法可以在 java 中創建 xml 文件。您可以在以下鏈接中找到一些示例。

http://www.javazoom.net/services/newsletter/xmlgeneration.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM