【问题标题】:Is It possible to parse large xml file which has size 800 MB using SAX Parser是否可以使用 SAX Parser 解析大小为 800 MB 的大型 xml 文件
【发布时间】:2012-05-15 05:03:59
【问题描述】:

我正在解析 transxchange 数据,其中包含一些非常大的文件,接近 800 MB。当我尝试解析这些文件时,出现以下错误。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
=======================================================================
    at java.util.ArrayList.<init>(Unknown Source)
    at java.util.ArrayList.<init>(Unknown Source)
    at JourneyPatternSections.<init>(JourneyPatternSections.java:21)
    at ReadBusData.startElement(ReadBusData.java:131)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at javax.xml.parsers.SAXParser.parse(Unknown Source)
    at ReadBusData.parseDocument(ReadBusData.java:51)
    at ReadBusData.<init>(ReadBusData.java:41)
    at ReadBusData.main(ReadBusData.java:218).

我正在关注this教程。
谁能帮帮我。

【问题讨论】:

  • 这里的问题是需要多少时间。
  • 你能指导我吗,我得到 java.lang.OutOfMemoryError: Java heap space。
  • 这可能对stackoverflow.com/a/4182801/945945有帮助
  • 你能打印你用来启动这个应用程序的命令行吗?我觉得问题是由于堆大小不足。试试 Xmx2g 并告诉我们发生了什么
  • 对于剩余的文件,它花费更少的时间并成功解析,只有两个文件有 100MB 和 800MB 的错误。

标签: java xml saxparser


【解决方案1】:

问:是否可以解析大小为 800 MB 的大型 xml 文件 SAX 解析器?

A:是的,当然!

问题不在于 SAX。 SAX 实际上是处理大文件的理想选择。

您的数组列表显然出现了问题。

它有多大?

其他结构有多大?

您是否真的需要存储您为其分配空间的所有数据?

您是否使用任何 VM 标志运行程序以分配更多内存?

您的 PC 有多少内存?您可以在支持更多内存的 PC 上运行它吗? 64 位电脑?

您使用的是 64 位 JVM 吗?

建议: 下载并试用 Visual VM 以在您的代码级别解决问题:

您可能会发现您分配的数据比您预期的要多。

恕我直言...

【讨论】:

    【解决方案2】:

    增加堆大小,例如,使用 -Xmx1g 启动 VM。

    See this blog.

    【讨论】:

      【解决方案3】:

      SAX 将成为解析大文件的最佳机制。 DOM 解析会将整个文档加载到内存中,您会遇到问题。您可能会遇到问题,因为您试图将所有内容存储在某种集合中。 SAX 非常适合解析 xml、处理它并继续前进。

      【讨论】:

        【解决方案4】:

        在创建 正在创建的数据结构时发生错误。您需要减少正在使用的内存量或增加程序的内存量。

        现在不是 1 GB。如果你可以给它 4 到 16 GB,这将使处理文件变得更加简单。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-03-28
          • 1970-01-01
          • 1970-01-01
          • 2018-01-07
          • 2011-10-20
          • 1970-01-01
          • 2023-03-18
          • 2011-12-05
          相关资源
          最近更新 更多