【发布时间】:2013-05-15 14:07:33
【问题描述】:
我正在用 libxml2 编写一个 XML 解析器。实际上,我完成了它,但是有一个非常烦人的记忆问题。该程序首先从我的数据库中获取一些链接,所有这些链接都指向一个 XML 文件。我使用 curl 来下载它们。过程很简单:我下载一个文件,然后解析它,等等……
问题似乎出在解析完成时。 Curl 下载下一个文件,但似乎之前的 XML 没有被释放,因为我猜 libxml2 会将它加载到 RAM 中。在解析最后一个 XML 时,我发现自己有大约 2.6GB 的泄漏(是的,其中一些文件真的很大......)而且我的机器只有 4GB 的 RAM。目前可以,但是以后会在数据库中添加更多链接,所以我现在必须修复它。
我的代码很基础:
xmlDocPtr doc;
doc = xmlParseFile("data.xml");
/* code to parse the file... */
xmlFreeDoc(doc);
我尝试使用:
xmlCleanupParser();
但文档说:“它不会释放任何与文档相关的内存。” (http://xmlsoft.org/html/libxml-parser.html#xmlCleanupParser)
所以,我的问题是:有人知道如何释放所有与文档相关的内存吗?
【问题讨论】:
-
如果您将大文件加载到内存中,我不明白您为什么会对巨大的内存使用量感到如此惊讶。 libxml2 是许多重要软件系统使用的一段备受推崇的代码,我非常怀疑正确使用 libxml2 是否存在“巨大的内存泄漏”。
-
你怎么知道有内存泄漏?也许你的测量有缺陷......请注意,内存统计数据可能很难正确解释。
-
尝试在 valgrind 下运行它,它会报告未分配内存的分配位置。
-
@carlosdc:我对内存使用情况并不感到惊讶,我只是不知道如何释放所有这些无用的数据。内存使用量仅在下载完成时才会增加(因此,就在解析之前),之后它绝对是静态的。
-
@rodrigo:我可以看到使用 htop,在调用 xmlFreeDoc(doc) 后没有任何内容被释放,所以我想我在那里遗漏了一些东西。当解析完成时,因此,当下一次下载开始时,内存使用量保持不变。 xmlFreeDoc 和 xmlFreeParser 是唯一似乎对释放内存有所帮助的函数,但它们都没有释放我想要的东西。我阅读了很多文档,但找不到相关内容。