0

我是 Java 新手。我有这个 2 GB 的 xml 文件,我需要解析它的数据并将其存储到数据库中。

StackOverflow 上的某个人建议我将 Dom4j 用于长 xml 文件。解析做得很好,但返回的文档(由 Dom4j 提供)非常长,并且在迭代时会将所有 DOM 对象加载到内存(堆)中。

这会导致内存不足异常。有人可以帮助我如何避免此类错误吗?我们在 Java 中是否存在一些 Java 中按需堆分配和沉积的现象?

4

2 回答 2

5

你有两个选择:

  1. 重新配置您的 JVM 以分配更多的最大内存(通过 -Xmx2g 或类似方法)。请参阅此处了解更多信息。此选项显然也受到您的操作系统和系统中可用内存量的限制。
  2. 使用流式API(例如SAX),它不会一次将所有 XML 加载到您的内存中,而是通过您的进程将其流式传输,从而允许您在不将整个文档保存在内存中的情况下对其进行分析

第一个选项可能会立即为您提供帮助,并且并非针对此问题。第二个选项是更具可扩展性的解决方案,因为它允许您分析任何大小的文档。当然,您需要担心分析结果的内存消耗,但这完全是另一回事。

于 2013-06-10T09:56:15.423 回答
1

如果您需要解析大型 XML 文件(并且添加到 Java 堆中并不总是有效),您需要一个 SAX 解析器,它允许您解析 XML 流而不是将整个 DOM 树加载到内存中。

您也可以查看SAXDOMIX

SAXDOMIX 包含可以在解析 XML 文档期间将 SAX 事件或 DOM 子树转发到您的应用程序的类。该框架定义了允许应用程序在 SAX 解析过程中获取 DOM 子树的简单接口。处理后,所有 DOM 子树都可以进行垃圾收集。这解决了 DOM 可伸缩性问题。

于 2013-06-10T09:57:07.327 回答