我写了一个程序,它使用OpenCV持久性模块来读取.xml.gz文件。我用一个类来管理这些数据。在构造函数中,它使用cv::FileStorage
读取所有数据。所有数据都在成员变量中,可以是std::vector
或cv::Mat
。在类的每个实例之间没有静态成员或任何共享。
这是奇怪的事情。如果我只使用我的类的一个实例,程序将消耗大约50MB的内存。但是,如果我使用两个实例,它将消耗大约600MB。如果我使用三个,它将消耗大约650MB。如果我使用四个,它将消耗大约700MB ......在一个实例和多个实例之间似乎有一条奇怪的界限。
我做了一些实验,这里有一些结果:
以下是此课程的代码:https://github.com/delphifirst/FaceX/blob/master/FaceX/face_x.cpp
在我的代码中指出问题或者给我一些调试这类问题的建议都会非常有帮助。
编辑: 我按照注释中的建议,并使用top -p而不是gnome-system-monitor来检查内存消耗。结果是: VIRT:1003552,RES:693228,SHR:8440,%MEM:33.8(计算机总共有2GB内存)
EDIT2: 我使用tcmalloc替换g ++的内存分配器,然后问题神秘地消失了。
答案 0 :(得分:0)
您可以链接到tcmalloc(将替换程序中常用内存分配例程的内存分配库)并使用其堆分析器。堆分析器将告诉您内存消耗的来源(即程序中的哪些函数正在分配所有内存)。这应该为您提供进一步调试的良好起点。