我有一个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内存?
答案 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可能更容易与之合作。)