我正在使用 expat 解析器来解析大约 15 GB 的 XML 文件。问题是它会引发“Out of Memory”错误并且程序 aborts 。
我想知道是否有任何机构面临与 expat 解析器类似的问题,或者它是一个已知的错误并已在以后的版本中得到纠正?
我正在使用 expat 解析器来解析大约 15 GB 的 XML 文件。问题是它会引发“Out of Memory”错误并且程序 aborts 。
我想知道是否有任何机构面临与 expat 解析器类似的问题,或者它是一个已知的错误并已在以后的版本中得到纠正?
我以前用 expat 来解析大文件,从来没有遇到过任何问题。我假设您使用的是 SAX 而不是 expat DOM 包装器之一。如果您使用的是 DOM,那么这就是您的问题所在 - 它本质上是试图将整个文件加载到内存中。
您是否在解析 XML 时分配对象并且可能不释放它们?那将是我要检查的第一件事。检查问题是否真的出在 expat 的一种方法 - 如果您将程序简化为具有空标记处理程序的简单版本(即它只是解析文件并且对结果不做任何事情),它仍然会耗尽内存吗?
我根本不认识外籍人士,但我猜它出于某种原因不得不在内存中保存太多状态。XML 是否以某种方式形成错误?您是否为大块的结束标签注册了处理程序?
我在想,如果您为一个大块的末尾注册了一个处理程序,并且 expat 应该将该块传递给该处理程序,那么 expat 可能在它能够完全收集该块之前耗尽内存。正如我所说,我不认识外籍人士,所以这可能是不可能的,我只是在问。
或者,你确定外籍人士是记忆丧失的地方吗?我可以想象这样一种情况,您保留有关 XML 文件内容和您自己的数据结构的一些信息,或者因为数据太大,或者因为代码中的内存泄漏,导致内存不足的情况。
Expat 是一个事件驱动的解析器,它不构造大型内存结构。因此,问题可能不是 expat(它被广泛用于解析大文件)——更有可能是您自己的代码。
Expat 有泄漏——我已经开始在一个长时间运行的服务器中使用它,并且发现它一直在泄漏内存,无论解析器是否被释放。最新版本的 xmlparse.c 不能解决这个问题,只能隐藏现有的泄漏。