CPU使用率高时OpenCV会堆积内存吗?

Posted

技术标签:

【中文标题】CPU使用率高时OpenCV会堆积内存吗?【英文标题】:Can OpenCV pile up memory when high CPU usage? 【发布时间】:2015-04-26 22:14:44 【问题描述】:

我正在调查我的代码中的内存堆积问题。

代码说明: (1) 从网络摄像头实时读取图像。 (2) 根据某些条件,将这些图像添加到 std::vector (3) std::vector 传递给另一个线程用于写入视频文件。 (4) 尝试 720p、540p、360p 的分辨率。

问题: - 尽管我在每次写入 .avi 文件后都清除了 std::vector,但内存不断堆积。 - 已验证,一旦我清除矢量,这些图像的引用计数将降至零。 - 上述情况仅在以 720p 运行时发生。在 540p、360p 下看不到。

在调查了很多内存泄漏之后,我没有发现任何问题。

我注意到这个问题只有在 CPU 达到 100% 时才会发生。在 CPU 使用率非常高的情况下,OpenCV 内存清理是否可能无法运行?有没有小伙伴遇到过类似的问题?

任何见解都会很有用。 此外,了解 OpenCV 如何触发执行内存清理的例程也会很有用。

【问题讨论】:

有趣的是,我有一些非常相似的行为。虽然不能总是重建内存消耗......你使用了哪个功能?我使用了 Haar 级联分类器。 我的是后台减法+主线程中的跟踪。而在消费者线程中,它只是使用 cv::VideoWriter 写入帧。 @Micka:你是怎么解决这个问题的。你用过什么变通方法吗? 尚无解决方案,但尚未达到 100% 的内存消耗... 是的。它具有 TBB 支持 【参考方案1】:

C++ 通常具有确定性内存管理。也就是说,根本不需要垃圾收集线程。每个使内存符合重用条件的操作都已经与一个线程相关联——通常是在对象超出范围时运行的析构函数。

可能有一个正在运行的线程可以简化空闲内存列表,但这只是理论上的问题,而不是真正的问题。 OpenCV没有这样的线程,AFAICT,普通的编译器也不用额外的线程。

所以我怀疑你已经交换了因果关系。由于所有delete 调用都在运行,CPU 达到 100%。

问题也可能是由设计错误引起的。假设您有一个生产者线程创建图像并将它们添加到队列中,以及一个消费者线程将图像从队列中取出。简单地说,如果消费者线程以较低的优先级运行,那么当 CPU 达到 100% 时,它将首先被饿死。这也意味着队列将被填满。但在较低分辨率下,有大量 CPU 可用,因此消费者线程可以保持队列为空。

【讨论】:

感谢您的意见。我查了一下,消费者线程堆积起来不是问题。任何额外的输入都会很有帮助。

以上是关于CPU使用率高时OpenCV会堆积内存吗?的主要内容,如果未能解决你的问题,请参考以下文章

性能调优:CPU

为啥使用VIRTUALBOX虚拟机设置的内存使用量过高时会使实际机蓝屏死机?

如何实现流畅观影体验?视频类应用内存和CPU大调查

性能调优2:CPU

性能调优之CPU

CPU 100% 运行时?