繁体   English   中英

expat解析器:memory消费

[英]expat parser: memory consumption

我正在使用 expat 解析器来解析大约 15 GB 的 XML 文件。 问题是它引发“内存不足”错误并且程序中止。

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

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

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

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

我根本不知道外籍人士,但我猜它必须在 memory 中持有太多的 state 出于某种原因。 XML 是否以某种方式形成? 您是否为大块的结束标签注册了处理程序?

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

或者,您确定外籍人士是 memory 损失的地方吗? 我可以想象这样一种情况,您保留有关 XML 文件的内容和您自己的数据结构的一些信息,或者因为数据太大,或者因为 memory 在您的代码中泄漏,导致了 ZCD69B4956F06CD8291Z8BF3 条件的输出。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM