创建具有大量节点的XML文件(1000万)

时间:2011-06-28 07:07:19

标签: java xml file

我尝试使用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中是否存在另一个用于创建XML文件的库,其中包含超过10 000 000个节点?

5 个答案:

答案 0 :(得分:5)

使用StAX将XML写为流,以便整个文档不需要驻留在内存中。

答案 1 :(得分:5)

对于这样的普通文件:考虑编写xml文件而不使用任何DOM或StAX:

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

这就是全部 - 您只需要一个将String写入文件的方法。以及获取文本数据的方法。

答案 2 :(得分:1)

您可以尝试使用SAX parserJDOM

DOM解析器基于XML数据的层次结构创建内部树。在SAX的基于事件的系统中,解析器不创建文档的任何内部表示。相反,解析器在发生某些事件(由SAX规范定义)时调用处理函数。这些事件包括文档的开头和结尾,查找文本节点,查找子元素以及命中格式错误的元素。

如果需要解析和处理大型XML文档,SAX实现比基于DOM的实现提供更多优势。

答案 3 :(得分:0)

您可能会尝试增加为JVM分配的内存。

但为什么你需要将整个文件放在内存中?如果没有一个非常好的理由,你就不应该这样做。

答案 4 :(得分:0)

您可以尝试增加JVM的内存大小。

有几种方法可以在java中创建xml文件。您可以在以下链接中找到一些示例。

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