我有一个用 C 语言编写的程序,它使用 Berkeley-Db、glib-2 和 libxml-2。它是一个搜索索引器,它使 NLP 具有句法和语义分析,并将概念结构存储在搜索索引中而不是单词中。
但是,我有一个问题——大约一天后,我的程序内存不足。
当我尝试在 valgrind 下运行我的程序时,它的运行速度非常慢,在我看来,比正常运行慢 10 倍。
我所有检查内存泄漏的尝试(在 valgrind 下进行了数周左右)都没有显示任何泄漏。
有人知道在这种情况下可以帮助我的一些工具吗?
我有一个用 C 语言编写的程序,它使用 Berkeley-Db、glib-2 和 libxml-2。它是一个搜索索引器,它使 NLP 具有句法和语义分析,并将概念结构存储在搜索索引中而不是单词中。
但是,我有一个问题——大约一天后,我的程序内存不足。
当我尝试在 valgrind 下运行我的程序时,它的运行速度非常慢,在我看来,比正常运行慢 10 倍。
我所有检查内存泄漏的尝试(在 valgrind 下进行了数周左右)都没有显示任何泄漏。
有人知道在这种情况下可以帮助我的一些工具吗?
我的解决方案是:
#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() 将在全局列表中搜索“数据”并将其删除,或发出警告。用“debugalloc();” 您应该打印整个列表(通常它应该是空的,或者充满了您期望的内容)。
另一种选择:你的内存管理变得支离破碎,......(upps,Alexey Frunze 在一秒钟前在评论部分写道。)
编辑:XML
我发表了关于 DOM 和 SAX 的评论,我感觉只是为了扩展这个评论:
<head><data>...</data><data>...</data>......<data>...</data></head>
是 SAX 的优秀候选者。在 DOM 中,整个 XML 将被读取并转换为内存,如果 <data> 本身是由不同大小的值构成的,这会很快导致内存碎片化。可能会发生,您的操作系统的内存模型将不利于分配少量内存。
使用 SAX,您只需将部分数据加载到内存中,并在使用后立即将其删除。但是你的实现必须从遍历 Document 变成一种状态机,带有馈送(<data>)和消费/处理(</data>)。