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