我试图创建一个文件来测试10000 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);
但收到错误:
线程"main"java.lang.OutOfMemoryError中出现异常:java堆空间访问com.sun.org.apache.xerces.internal.dom.CoreDocumentImpl。createElement(CoreDocumentImpl.java:620)总的来说。CreatXMLFile.main(CreatXMLFile.java:27)
是否存在另一个库,用于在Java中创建具有超过10000 000个节点的XML文件?
对于类似的琐碎文件:考虑在不使用任何DOM或StAX:的情况下编写xml文件
writeToFile("<root>n");
for (int i = 0; i < 10000000; i++) {
writeToFile("<ch>" + getData(i) + "</ch>n");
}
writeToFile("</root>n");
仅此而已,您只需要一个将String写入文件的方法。以及获取文本数据的方法。
使用StAX将XML写成流,这样整个文档就不需要驻留在内存中。
您可以尝试使用SAX解析器或JDOM
DOM解析器基于XML数据的层次结构创建一个内部树。在SAX的基于事件的系统中,解析器不创建文档的任何内部表示。相反,解析器在某些事件(由SAX规范定义)发生时调用处理程序函数。这些事件包括文档的开始和结束、查找文本节点、查找子元素以及命中格式错误的元素。
如果您需要解析和处理庞大的XML文档,SAX实现比基于DOM的实现提供了更多的好处。
您可以尝试增加为JVM分配的内存。
但是,为什么需要将整个文件保存在内存中呢?如果没有很好的理由,你就不应该这么做。
您可以尝试增加JVM的内存大小。
有几种方法可以在java中创建xml文件。您可以在下面的链接中找到一些示例。
http://www.javazoom.net/services/newsletter/xmlgeneration.html