【发布时间】:2015-07-24 13:25:03
【问题描述】:
我编写了一个程序,它使用 OpenCV 持久性模块来读取 .xml.gz 文件。我使用一个类来管理这些数据。在构造函数中,它使用cv::FileStorage 读取所有数据。所有数据都在std::vector 或cv::Mat 的成员变量中。类的每个实例之间没有静态成员或共享任何东西。
这是奇怪的事情。如果我只使用我的类的一个实例,程序将消耗大约 50MB 内存。但是,如果我使用两个实例,它将消耗大约 600MB。如果我使用三个,它将消耗大约 650MB。如果我使用四个,它会消耗大约 700MB ......只有一个实例和多个实例之间似乎有一条奇怪的线。
我做了一些实验,结果如下:
- 此问题仅发生在 Linux(Ubuntu 14.04、OpenCV 3.0)上,不会发生在 Windows 上。
- 我用valgrind检查,程序没有内存泄漏。
这是这个类的代码: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内存)
编辑2: 我用tcmalloc替换了g++的内存分配器,然后问题就莫名其妙的消失了。
【问题讨论】:
-
你是如何测量内存消耗的?
-
调试的一个建议是编写一个内存查询类,为您提供 PSS 或 RES 或 VIRT 内存。你可以在每个块之后使用这个查询类的一个对象,看看内存在哪里增加。
-
gnome-system-monitor
-
有时出于性能考虑,c++ 中的 lib 不会将内存释放回操作系统。
-
@SatishChalasani 当我只使用一个实例时,内存消耗会暂时上升到大约 600MB,但最终会减少到 50MB。因此,我认为 OpenCV 使用这些内存来解析 xml 文件。但是为什么当我在实例上使用时它会返回内存,而当我使用多个时它不会返回内存~~
标签: c++ debugging opencv memory