1

我正在尝试测试不同的解析器,当我尝试解析 70 MB xml 文件时,我遇到了 DOM 问题。错误是 java.lang.OutOfMemoryError 我认为我的电脑不错,所以我不确定是否有问题。

另一个问题。我正在使用秒表来捕捉解析时间,但我想我把 stopwatch.stop 放在错误的地方。我想它应该是在之后

Document document = builder.parse("file.xml"); 

我把它放在打印出所有节点的for循环之后

谢谢

4

4 回答 4

3

使用默认堆大小并解析大型 XML 文档时的常见问题。您将需要增加 JVM 的堆大小。执行程序时,将参数“-Xmx1024m”(或 -Xmx512m 或您认为需要的任何内容,堆只会占用指定点所需的内存)到 jvm 命令。

示例:java -Xmx1024m -jar myprogram.jar

这也可以在各种 IDE 的运行时属性中设置。在 Eclipse 中,它是应用程序运行配置的“VM 参数”部分。

于 2013-05-01T20:18:32.717 回答
3

此外,如果您要处理大型 XML 文档,您可能需要尝试不同的方法。决定因素是您是否需要同时在内存中保存整个文档。为了节省空间,您可以单独解析部分 XML。

这称为流式 XML 解析器。您将需要 Google 一些不同的 Java 流式 XML 解析器。我的第一件事是StAX,这是规范。一个常见的实用程序是Apache Axiom

http://en.wikipedia.org/wiki/StAX

于 2013-05-01T20:26:37.467 回答
2

解决方案取决于java.lang.OutOfMemoryError您收到的类型。如果是,则PermGen space需要将以下参数添加到 JVM 以设置 PermGen(在示例中它将设置为 300 MB):

-XX:MaxPermSize=300m

如果是Java Heap Space添加这个参数来设置 Heap 空间(在本例中为 1 GB):

-Xmx1024m
于 2013-05-01T20:08:20.533 回答
0

另一个建议:您可能想查看 ScaleDOM,它允许解析非常大的 XML 文件:https ://github.com/whummer/scaleDOM

由于 XML 节点的延迟加载,ScaleDOM 占用的内存很小。它只将 XML 文档的一部分保存在内存中,并在必要时从源文件中重新加载节点。

于 2014-08-26T21:02:46.867 回答