是否可以使用SAX Parser解析大小为800 MB的大型xml文件

时间:2012-05-15 05:04:00

标签: java xml saxparser

我正在解析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教程。
任何人都可以帮助我。

4 个答案:

答案 0 :(得分:2)

  

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

答:是的,当然!

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

你的arraylist明显出现了这个问题。

它有多大?

其他结构有多大?

你真的需要来存储你为之分配空间的所有数据吗?

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

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

您使用的是64位JVM吗?

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

您可能会发现您分配的数据远远超出预期。

... IMHO

答案 1 :(得分:1)

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

See this blog.

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

这些天不是一个GB。如果你能给它4到16 GB,这将使处理文件更加简单。