我压倒一切

public void characters(char[] ch,
                       int start,
                       int length)
                throws SAXException


解析XML文档时。它非常适合小型XML文档(1MB或更小)。但是,如果XML文档为100MB或更大,则我开始在此函数内获取Java堆空间不足而导致内存不足的错误。

经过一些研究here之后,我意识到上面的字符数组“ ch”的大小取决于“ startElement()”和“ endElement()”之间有多少个字符。

所以我想知道,是否有一种聪明的方法可以覆盖“ startElement”和“ endElement”以返回较小的数据块?

例如,假设我有一个XML文件,如下所示:

<element1>
   This is a very simple sentence that is not very long.
</element1>


当前,“ characters()”函数将返回“这是一个很短的句子,长度不长。”作为一个大块。

但是我的问题是,如果XML文件如下所示:

<element1>
   An entire book's worth of content is pasted in this single element. Possibly millions of characters.
</element1>


有没有一种方法可以“欺骗” startElement()和endElement()以使characters()函数返回整本书的书本块?

最佳答案

您不能欺骗SAX解析器以较小的块将字符数据馈送到ContentHandler。解析器已经被允许以小于元素整个内容的块的形式提供它,但是,我希望当内容很大时,这将是解析器的正常行为。否则,出于特殊原因,将要求它们在内部缓冲潜在的大量数据。

如果发现您的特定解析器确实交付了比您想要的更大的块,则应查阅其文档。您可以设置一个选项来影响它。否则,您的替代方法是查找或创建一个更喜欢其行为的解析器。

但是,请检查您的事实。可能是解析器确实以合理大小的块返回了数据,而问题实际上出在您对它们的处理方式中。特别是,如果您要构建整个文件的某种内存表示形式,则接收到的文件大小无关紧要。

还可以考虑增加VM的最大堆大小。一个100MB的文件并不是很大,但是您的VM可能会因堆大小限制而陷入困境,而堆大小限制对于该问题来说是不切实际的低。

关于java - 您如何欺​​骗SAX在Java中将大块分解成较小的块?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29973538/

10-09 02:05