0

我正在使用 expat 解析器来解析大约 15 GB 的 XML 文件。问题是它会引发“Out of Memory”错误并且程序 aborts 。

我想知道是否有任何机构面临与 expat 解析器类似的问题,或者它是一个已知的错误并已在以后的版本中得到纠正?

4

4 回答 4

2

我以前用 expat 来解析大文件,从来没有遇到过任何问题。我假设您使用的是 SAX 而不是 expat DOM 包装器之一。如果您使用的是 DOM,那么这就是您的问题所在 - 它本质上是试图将整个文件加载到内存中。

您是否在解析 XML 时分配对象并且可能不释放它们?那将是我要检查的第一件事。检查问题是否真的出在 expat 的一种方法 - 如果您将程序简化为具有空标记处理程序的简单版本(即它只是解析文件并且对结果不做任何事情),它仍然会耗尽内存吗?

于 2009-03-18T12:49:28.077 回答
1

我根本不认识外籍人士,但我猜它出于某种原因不得不在内存中保存太多状态。XML 是否以某种方式形成错误?您是否为大块的结束标签注册了处理程序?

我在想,如果您为一个大块的末尾注册了一个处理程序,并且 expat 应该将该块传递给该处理程序,那么 expat 可能在它能够完全收集该块之前耗尽内存。正如我所说,我不认识外籍人士,所以这可能是不可能的,我只是在问。

或者,你确定外籍人士是记忆丧失的地方吗?我可以想象这样一种情况,您保留有关 XML 文件内容和您自己的数据结构的一些信息,或者因为数据太大,或者因为代码中的内存泄漏,导致内存不足的情况。

于 2009-03-18T12:31:44.843 回答
1

Expat 是一个事件驱动的解析器,它不构造大型内存结构。因此,问题可能不是 expat(它被广泛用于解析大文件)——更有可能是您自己的代码。

于 2009-03-18T13:06:50.267 回答
1

Expat 有泄漏——我已经开始在一个长时间运行的服务器中使用它,并且发现它一直在泄漏内存,无论解析器是否被释放。最新版本的 xmlparse.c 不能解决这个问题,只能隐藏现有的泄漏。

于 2011-05-20T18:43:33.710 回答