Efficient way to reduce memory (RAM) consumption while writing huge file data into XML(在将大量文件数据写入XML时减少内存(RAM)消耗的高效方法)
问题描述
我必须将7个列表写入XML文件,每个列表的大小为1 GB到5 GB。
预期输出的XML文件如下:
<doc>
<items1>
<itemA>..</itemA>
..
</items1>
<items2>
<itemB>..</itemB>
..
</items2>
<items3>
<itemC>..</itemC>
..
</items3>
.
.
.
<items7>
<itemG>..</itemG>
..
</items7>
</doc>
Java对象如下:
List<ItemA> items1 = new List<>(); // 1GB-5GB
List<ItemB> items2 = new List<>(); // 1GB-5GB
List<ItemC> items3 = new List<>(); // 1GB-5GB
List<ItemD> items4 = new List<>(); // 1GB-5GB
List<ItemE> items5 = new List<>(); // 1GB-5GB
List<ItemF> items6 = new List<>(); // 1GB-5GB
List<ItemG> items7 = new List<>(); // 1GB-5GB
将所有列表包装到单个对象(目录)中到一个Java对象中,并且一次封送消耗大量内存,而且每次当列表大小增加时,我们都必须缩放我们的底层。代码如下:
JAXBContext.newInstance("ta").createMarshaller().marshal(new ObjectFactory().createCatalogue(catalogue), new FileOutputStream(fileName));
此处的Catalogue是一个包含所有七个列表的Java对象。
有没有什么聪明的方法可以通过以块为单位写入数据来减少内存消耗。为此,我研究了stax,但找不到写入数据列表的方法。
在Java中,有没有什么方法可以高效地将高达20 GB的数据写入到XML中,而无需在基础设施上扩展RAM?
我们希望分别写入每个列表,并且在写入下一个列表时不应将以前写入的文件加载到堆中。
XMLX
使用StAX很可能是最好的方法,不仅因为您不必将整个推荐答案文档保存在内存中,而且还因为您也不必将所有项都保存在内存中。不知道您在哪里寻找StAX的写作,但我在The Java EE 5 Tutorial中找到了以下内容:
下面的示例摘自StAX规范,说明如何 实例化输出工厂、创建编写器并编写XML输出:XMLOutputFactory output = XMLOutputFactory.newInstance(); XMLStreamWriter writer = output.createXMLStreamWriter( ... ); writer.writeStartDocument(); writer.setPrefix("c","http://c"); writer.setDefaultNamespace("http://c"); writer.writeStartElement("http://c","a"); writer.writeAttribute("b","blah"); writer.writeNamespace("c","http://c"); writer.writeDefaultNamespace("http://c"); writer.setPrefix("d","http://c"); writer.writeEmptyElement("http://c","d"); writer.writeAttribute("http://c","chris","fry"); writer.writeNamespace("d","http://c"); writer.writeCharacters("Jean Arp"); writer.writeEndElement(); writer.flush();
此代码生成以下XML(换行不规范):
<?xml version=’1.0’ encoding=’utf-8’?> <a b="blah" xmlns:c="http://c" xmlns="http://c"> <d:d d:chris="fry" xmlns:d="http://c"/> Jean Arp </a>
编辑:我还注意到有一个关于generating XML with StAX in the link you posted的部分。还要注意,编写列表并没有什么特别之处,您只需迭代列表并为每个条目编写一个标记即可。大概是这样的:
XMLStreamWriter writer = ...;
writer.writeStartDocument();
writer.writeStartElement("doc");
// Write the first list:
writer.writeStartElement("items1");
for (ItemA e: items1) {
writer.writeStartElement("itemA");
// TODO: Write attributes, sub-elements, text or whatever is needed
writer.writeEndElement();
});
writer.writeEndElement();
// TODO: Write items2, items3, ..., items7 in the same fashion as items1
// Close document
writer.writeEndElement();
writer.writeEndDocument();
XMLStreamWriter是低级的,这意味着除了将XML写入流之外,它不会为您做更多事情,但它并不复杂。因此,与使用JAXB相比,您最终可能需要更多的代码行,但是您必须编写的代码不会特别难写。
这篇关于在将大量文件数据写入XML时减少内存(RAM)消耗的高效方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在将大量文件数据写入XML时减少内存(RAM)消耗的高效方法
基础教程推荐
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01