我有一个用C编写的程序,它使用Berkeley-Db、glib-2和libxml-2。它是一种具有句法和语义分析功能的NLP检索索引器,它将概念结构存储在检索索引中,而不是词。
然而,我遇到了一个问题--过了一天左右,我的程序内存耗尽了。
当我试图运行我的程序时,它的工作非常慢,在我看来,比正常运行慢10倍。
我所有的检查内存泄漏的尝试都没有显示出任何泄漏。
有谁知道在这种情况下可以帮助我的工具吗?
发布于 2012-10-01 12:39:33
我的解决办法是:
#define malloc(size) mymalloc(size, __FILE__, __FUNCTION__, __LINE__)
... (realloc, calloc, free)
void *mymalloc(size_t size, char *file, char *function, int line)
{
void *data = malloc(size);
addList(data, size, file, function, line);
return data;
}
void myfree(void *data)
{
removeList(data);
free(data);
}
void debugalloc()
{
printList();
}removeList()将搜索全局列表中的“数据”并删除它,或者发出警告。使用“调试器()”,您应该打印整个列表(通常它应该是空的,或者充满了您希望它拥有的内容)。
另一个选项:您的内存管理变得支离破碎,.(几秒钟前,Alexey在评论部分写道。)
EDITH:XML
我对DOM和SAX发表了评论,我只想扩展一下这个评论:
<head><data>...</data><data>...</data>......<data>...</data></head>是SAX的最佳人选。在DOM中,如果< data >本身具有不同大小的值,则整个XML将被读取并转换为内存,如果本身具有不同大小的值,则会很快导致内存碎片。可能发生的情况是,您的操作系统的内存modell将防止少量内存出现错误。
使用SAX,您只会将部分数据加载到内存中,并在消耗数据后立即将其处理掉。但是,您的实现必须从遍历文档更改为一种状态机,其中包含输入(< data >)和消费/处理(< / data >)。
https://stackoverflow.com/questions/12672770
复制相似问题