我正在尝试测试不同的解析器,当我尝试解析 70 MB xml 文件时,我遇到了 DOM 问题。错误是 java.lang.OutOfMemoryError 我认为我的电脑不错,所以我不确定是否有问题。
另一个问题。我正在使用秒表来捕捉解析时间,但我想我把 stopwatch.stop 放在错误的地方。我想它应该是在之后
Document document = builder.parse("file.xml");
我把它放在打印出所有节点的for循环之后
谢谢
使用默认堆大小并解析大型 XML 文档时的常见问题。您将需要增加 JVM 的堆大小。执行程序时,将参数“-Xmx1024m”(或 -Xmx512m 或您认为需要的任何内容,堆只会占用指定点所需的内存)到 jvm 命令。
示例:java -Xmx1024m -jar myprogram.jar
这也可以在各种 IDE 的运行时属性中设置。在 Eclipse 中,它是应用程序运行配置的“VM 参数”部分。
此外,如果您要处理大型 XML 文档,您可能需要尝试不同的方法。决定因素是您是否需要同时在内存中保存整个文档。为了节省空间,您可以单独解析部分 XML。
这称为流式 XML 解析器。您将需要 Google 一些不同的 Java 流式 XML 解析器。我的第一件事是StAX,这是规范。一个常见的实用程序是Apache Axiom。
解决方案取决于java.lang.OutOfMemoryError
您收到的类型。如果是,则PermGen space
需要将以下参数添加到 JVM 以设置 PermGen(在示例中它将设置为 300 MB):
-XX:MaxPermSize=300m
如果是Java Heap Space
添加这个参数来设置 Heap 空间(在本例中为 1 GB):
-Xmx1024m
另一个建议:您可能想查看 ScaleDOM,它允许解析非常大的 XML 文件:https ://github.com/whummer/scaleDOM
由于 XML 节点的延迟加载,ScaleDOM 占用的内存很小。它只将 XML 文档的一部分保存在内存中,并在必要时从源文件中重新加载节点。