我已经阅读了一些关于使用SAX解析器在java中使用DOM解析XML文件的优点的文章。 最吸引我的那个(正如所讨论的here)就是那个
Sax适用于大型XML文件,而SAX解析器不会将XML文件作为整体加载到内存中。
但是现在我已经编写了一个解析器,使用SAX从XML文件中导出几乎 1.4 GB 的大文件中的实体,它会生成以下异常。
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; The parser has encountered more than "64,000" entity expansions in this document; this is the limit imposed by the application.
如果整个文件没有加载到内存中,内存有什么问题。
我该如何解决这个问题?
答案 0 :(得分:3)
使用JVM参数更改实体扩展限制:
-DentityExpansionLimit=1000000
答案 1 :(得分:0)
您也可以考虑使用StAX。
SAX是事件驱动和串行的。它可以处理大型XML,但占用大量CPU资源。
DOM正在将完整的文档记录在内存中。
StAX是一种更新的API。它是通过XML流式传输的。它可以看作是文档上的游标或迭代器。它的优点是可以跳过不需要的元素(属性,标签......)。如果使用得当,它可以减少很少的CPU资源。
https://docs.oracle.com/javase/tutorial/jaxp/stax/why.html
使用SAX,XML会推动事件。
使用StAX,您可以将XML提取给您。