expat解析器:内存消耗

时间:2009-03-18 12:17:05

标签: c++ xml large-files out-of-memory expat-parser

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

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

4 个答案:

答案 0 :(得分:2)

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

您在解析XML时是否分配对象并且可能没有取消分配它们?这将是我要检查的第一件事。检查问题是否真的与expat一起使用的一种方法 - 如果将程序缩减为具有空标记处理程序的简单版本(即它只解析文件并且对结果不执行任何操作)是否仍会耗尽内存?

答案 1 :(得分:1)

我根本不认识外籍人士,但我猜想由于某种原因,他必须在内存中保留太多状态。 XML mal是否以某种方式形成?你有为大块的结束标签注册的处理程序吗?

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

或者,你确定expat是内存丢失的地方吗?我可以想象一种情况,你要保留一些关于XML文件内容的信息,以及你自己的数据结构,或者因为数据太大,或者因为你的代码中存在内存泄漏,导致了内存不足的情况。 / p>

答案 2 :(得分:1)

Expat是一个事件驱动的解析器,它不构造大的内存结构。所以它可能不是expat(它被广泛用于解析大文件)这就是问题 - 更有可能是你自己的代码。

答案 3 :(得分:1)

Expat漏洞 - 我已经开始在长时间运行的服务器中使用它,并且发现它始终泄漏内存,无论解析器是否被释放。更新版本的xmlparse.c无法解决此问题,只隐藏现有泄漏。