繁体   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