【问题标题】:XOM Parser Out of heap memoryXOM 解析器堆内存不足
【发布时间】:2014-01-27 15:11:53
【问题描述】:

我正在使用 XOM 库解析文件。 Java 应用程序运行良好,但是当我解析超过 200 MB 的大文件时遇到内存问题。

当我使用以下代码构建文件时,我面临堆大小的内存

        Builder profileFileBuilder = new Builder(profileFileXMLReader);
        Document profileFileDocument = profileFileBuilder.build(profileFile);

我有什么替代方法来构建这种大小的文件?我尝试为 JVM 分配更多内存,但它不接受超过 1024 MB

提前谢谢你

【问题讨论】:

  • 您在使用 Eclipse 先生吗?
  • 我正在使用 IntelliJ IDEA
  • 你是如何设置jvm内存的?
  • 我使用命令-Xmx1024m

标签: java xml-parsing xom


【解决方案1】:

您可以通过扩展NodeFactory 将XOM 用作流解析器,这样它就不会将XML 保存在内存中,而是对其进行处理然后忘记它。这适用于在容器元素中包含许多较小节点的 XML。例如,XML 如下:

记录>

XOM 文档中有一个关于如何扩展 NodeFactory 的示例:http://www.xom.nu/tutorial.xhtml#Lister

您基本上解析内容(在您感兴趣的文档中的任何级别),然后不将其添加到内存树中:http://www.xom.nu/tutorial.xhtml#d0e1424

【讨论】:

    【解决方案2】:

    根据您对文档的处理方式,一种替代方法可能是从基于 DOM 的处理切换到基于 SAX 的处理(或其他事件驱动的序列化程序接口)。这将使您可以使用根据您的需要调整的内部内存模型,因此比一般 DOM 更有效,并且如果您可以从现有数据模型序列化或动态生成内容,则可能完全避免构建内存模型.

    例如,Xalan XSLT 处理器使用 SAX 解析器在内部而不是 DOM 构建自定义数据模型(XSLT 通常需要随机访问文档的内容,因此需要一些内存模型),并且尽可能将输出直接生成到 SAX 序列化程序。

    更进一步,您可以设置一个数据模型,该模型显式地将文档的部分页面进出页面,而不是依靠操作系统的交换器。不过,我不确定这会是一场净胜。

    请注意,DOM 是个好东西(他说,作为它的作者之一)——但作为一种通用工具,它并不是所有任务的理想答案。

    顺便说一句,在针对一些更复杂的问题调试 Xalan 时,我经常将 -Xmx 设置为高于 1024m。 Java 是否允许您使用更高的值取决于 JVM 和您的操作系统配置,但我认为值得仔细检查您是否可以将其推高一点。

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 2011-02-28
      • 2013-09-10
      • 2021-07-05
      相关资源
      最近更新 更多