gpt4 book ai didi

java - JAXB - 解码 OutOfMemory : Java Heap Space

转载 作者:IT王子 更新时间:2023-10-28 23:35:16 28 4
gpt4 key购买 nike

我目前正在尝试使用 JAXB 解码 XML 文件,但似乎 XML 文件太大(~500mb),解码器无法处理。我不断收到 java.lang.OutOfMemoryError: Java heap space @

Unmarshaller um = JAXBContext.newInstance("com.sample.xml");
Export e = (Export)um.unmarhsal(new File("SAMPLE.XML"));

我猜这是因为它试图将大型 XML 文件作为对象打开,但该文件对于 java 堆空间来说太大了。

还有其他更“节省内存”的方法来解析大约 500mb 的大型 XML 文件吗?或者也许是一个可以帮助我处理大型 XML 文件的解码器属性?

这是我的 XML 的样子

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- -->
<Export xmlns="wwww.foo.com" xmlns:xsi="www.foo1.com" xsi:schemaLocation="www.foo2.com/.xsd">
<!--- --->
<Origin ID="foooo" />
<!---- ---->
<WorkSets>
<WorkSet>
<Work>
.....
<Work>
....
<Work>
.....
</WorkSet>
<WorkSet>
....
</WorkSet>
</WorkSets>

我想在 WorkSet 级别解码,仍然能够阅读每个 WorkSet 的所有工作。

最佳答案

您的 XML 是什么样的?通常对于大型文档,我建议人们利用 StAX XMLStreamReader,以便 JAXB 可以将文档分 block 解码。

input.xml

在下面的文档中有很多 person 元素的实例。我们可以使用带有 StAX XMLStreamReader 的 JAXB 来一次一个地解码相应的 Person 对象,以避免内存不足。

<people>
<person>
<name>Jane Doe</name>
<address>
...
</address>
</person>
<person>
<name>John Smith</name>
<address>
...
</address>
</person>
....
</people>

演示

import java.io.*;
import javax.xml.stream.*;
import javax.xml.bind.*;

public class Demo {

public static void main(String[] args) throws Exception {
XMLInputFactory xif = XMLInputFactory.newInstance();
XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml"));
xsr.nextTag(); // Advance to statements element

JAXBContext jc = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {
Person person = (Person) unmarshaller.unmarshal(xsr);
}
}

}

人物

我们需要在要解码的 XML 片段的本地根上添加 @XmlRootElement 注释,而不是匹配 XML 文档的根元素。

@XmlRootElement
public class Person {
}

关于java - JAXB - 解码 OutOfMemory : Java Heap Space,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7968694/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com