将巨大的XML文件从DOM写入文件

时间:2014-02-28 05:03:15

标签: java xml dom

我有一个java程序,它查询一个有数百万条记录的表,并生成一个xml,每条记录都作为节点。

挑战在于程序的堆内存不足。我为该程序分配了2GB堆。

我正在寻找创建如此巨大的xml的替代方法。

我们可以写出部分DOM对象到文件并释放内存吗? 例如,在DOM对象中创建100个节点,写入文件,释放内存,然后在DOM中创建接下来的100个节点等。

将节点写入文件的代码

DOMSource source = new DOMSource(node);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);

但是如何在将节点写入文件后释放DOM内存?

3 个答案:

答案 0 :(得分:2)

为什么需要生成DOM?尝试直接编写XML。从Java输出XML最方便的API是StAX XMLStreamWriter接口。有许多XMLStreamWriter实现可以生成词法(序列化)XML,包括Saxon序列化程序,如果需要,它可以对序列化的方式进行大量控制(例如缩进和编码)。

答案 1 :(得分:0)

我会使用一个简单的OutputStreamWriter并自己格式化xml,你不需要创建一个巨大的dom结构。我认为这是最快的方式。

当然取决于你想要完成多少xml结构。如果一个表行对应一个xml行,这应该是最快的方法。

答案 2 :(得分:0)

为了处理一个巨大的文档,SAX通常是首选,因为它只在内存中保留了你明确决定保留在内存中的东西 - 这意味着你可以使用一个专门的,因此更小的数据模型。对于这样的任务,您无需交叉引用文档的不同部分,您可能根本不需要任何数据模型,只需直接从输入数据生成SAX事件并将其提供给序列化程序。

(StAX在这方面非常相同。我通常更喜欢使用SAX,因为它是JAXP API包的一部分,此时应该存在于几乎所有Java环境中,但是StAX可能更容易与之合作。)