我正在使用expat解析器解析一个大约15 GB的XML文件。问题是它抛出一个“内存不足”错误,程序中止。
我想知道有没有什么机构遇到过类似的问题,或者它是一个已知的bug,并在后来的版本中得到了纠正?
发布于 2009-03-18 12:49:28
我以前使用expat解析过大文件,从来没有遇到过任何问题。我假设您使用的是SAX,而不是expat DOM包装器。如果您使用的是DOM,那么这就是您的问题所在--它本质上是试图将整个文件加载到内存中。
您是否在解析XML时分配对象,而不是释放它们?这将是我要检查的第一件事。检查问题是否真的与expat有关的一种方法是-如果您将程序简化为具有空标记处理程序的简单版本(即,它只解析文件,而不对结果做任何操作),它仍然会耗尽内存吗?
发布于 2009-03-18 12:31:45
我一点也不了解expat,但我猜出于某种原因,它必须在内存中保存太多的状态。XML mal是以某种方式形成的吗?你有为大块的结束标记注册的处理程序吗?
我在想,如果你有一个为大块的末尾注册的处理程序,而expat期望将块传递给处理程序,那么expat可能在它能够完全收集该块之前就耗尽了内存。就像我说的,我不认识外国人,所以这可能是不可能的,我只是问问。
或者,您确定expat是内存丢失的地方吗?我可以想象这样一种情况:您保存了一些关于XML文件内容和您自己的数据结构的信息,或者是因为数据太大,或者是因为代码中的内存泄漏导致了内存不足的情况。
发布于 2009-03-18 13:06:50
Expat是一个事件驱动的解析器,它不会构造大的内存结构。所以它可能不是expat (它被广泛用于解析大文件)是问题所在--它更有可能是您自己的代码。
https://stackoverflow.com/questions/658016
复制相似问题