0

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

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

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

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

先感谢您

4

2 回答 2

1

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

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

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

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

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

于 2014-01-27T16:43:28.483 回答
1

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

<记录>
  <record><a_little_xml/></record>
  <record><a_little_xml/></record>
  <record><a_little_xml/></record>
  <record><a_little_xml/></record>
  <record><a_little_xml/></record>
</记录>

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

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

于 2014-01-27T20:24:50.377 回答