OpenCV Python:如何避免 py3 中的 cv2.imwrite() 内存“泄漏”?

Paz*_*aza 6 python linux opencv memory-leaks python-3.x

我正在 Ubuntu 16.04 (x86) 上使用 OpenCV(3.4.1,本地构建)调查 Python (3.5.2) 应用程序中的内存泄漏(或“膨胀”)。

该应用程序经常将图像写入文件,并且它使用.imwrite()方法来实现此目的。我发现这种使用会.imwrite()导致 RAM 使用量疯狂增长,但我找不到这种行为的原因。

为了调试这个问题,我准备了这个简单的测试脚本:

#!/usr/bin/python3

import cv2
import time

img = cv2.imread("vista.jpg")

idx = 0
while True:
    filename = "/tmp/vista_copy_" + str(idx) + ".tiff"
    cv2.imwrite(filename, img)
    idx = idx + 1
    time.sleep(1)
Run Code Online (Sandbox Code Playgroud)

运行此脚本时,我监控了可用 RAM(每 10 秒采样一次可用内存):

$ while [ 1 ] ; do grep MemFree /proc/meminfo ; sleep 10 ; done
MemFree:          898024 kB
MemFree:          780640 kB
MemFree:          667848 kB
MemFree:          545700 kB
MemFree:          437196 kB
MemFree:          315820 kB
MemFree:          298380 kB
MemFree:          298292 kB
MemFree:          297448 kB
MemFree:          297080 kB
MemFree:          915616 kB
Run Code Online (Sandbox Code Playgroud)

最后一个示例(其中可用内存返回到其初始值)是在我从目标中删除图像文件后拍摄的,这可能表明这是一个操作系统问题,或者可能是程序没有正确关闭文件(尽管我在 C++ 源代码中找不到这方面的线索)。

我发现这种行为非常奇怪,更重要的是因为 imwrite 是一个基本方法。任何人都可以帮忙调试和解决这个问题吗?

编辑

所以显然我的测试脚本中的内存消耗是由于 /tmp 实际上是 RAM 驱动器,但在写入通过以太网适配器连接的外部驱动器时问题仍然存在。

更新

当写入物理驱动器上的本地文件夹时,问题会重现。看来这是一个一般的操作系统问题,与 imwrite 无关。操作系统缓存文件,但永远不会释放该缓存(也许它“认为”它有足够的内存用于所有这些缓存)。定期
执行(如此此处建议的那样)是目前合理的解决方法,但我们想要一种侵入性/暴力性较小的解决方案,这将阻止系统使用如此多的缓存,或者使其在不强制的情况下释放缓存。'echo 3 > /proc/sys/vm/drop_caches'

Mic*_*cka 2

看起来 /tmp 可能是某种 ramdisk 挂载,因此它可能会消耗 RAM,而不是磁盘空间,并且在重新启动后会被清空。

https://wiki.archlinux.org/index.php/tmpfs

您可以通过测试不同目标文件夹的脚本来确认这一点,例如将文件存储到您的主目录中。