【发布时间】:2018-11-07 00:50:39
【问题描述】:
我正在尝试将大小约为 6Gb 的大型 xml 文件解组为 java 对象。下面是我用来解析大文件的实现。它仅适用于 20Gb 堆空间。我想进一步减少内存占用。
XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("abc.xml"));
xsr.nextTag();
long addEntity = 0;
long unmarshalEntity = 0;
JAXBContext jc = JAXBContext.newInstance(XYZ.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {
long start1 = System.currentTimeMillis();
XYZ sample = (XYZ) unmarshaller.unmarshal(xsr);
}
它不断抛出原因:java.lang.OutOfMemoryError:任何较小的堆都超出了 GC 开销限制。如果我解析整个文件,我将拥有 330 万个 XYZ 对象。那么有没有一种方法可以让我将这些对象保存在内存中,因为我需要对这些对象进行一些后期处理,因为后期处理依赖于多个 XYZ 对象。
【问题讨论】:
-
嗯......当您尝试将 6GB XML 文件解组为对象时,您期望什么?解决方案是,不要一次阅读所有内容。您已经创建了一个 XML 流阅读器。使用它。
-
您是否同时需要所有对象?否则,您可以分块进行后期处理。或者将它们交换为具有正常序列化的二进制文件,然后一次串行处理该文件一个对象。我认为您的问题与 XML 无关,代码看起来不错。您可以通过不抓住对象来验证。如果问题是您需要 330 万个对象并且无法为它们分配内存,那么您就卡住了。
-
如何查找所有 3.3M 对象的大小以识别其超出堆大小?
-
您可以use JAXB with StAX 以类似流的方式处理对象。
标签: java xml-parsing jaxb