python - OpenCV Python:如何避免 py3 中的 cv2.imwrite() 内存“泄漏”?
问题描述
我正在调查在 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)
在运行此脚本时,我监控了空闲 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
最后一个样本,空闲内存恢复到初始值,是在我从目标中删除图像文件后拍摄的,这可能表明这是一个操作系统问题,或者程序没有正确关闭文件(尽管我在 C++ 源代码中找不到这方面的线索)。
我觉得这种行为很奇怪,更是如此,因为 imwrite 是一种基本的方法。任何人都可以帮忙调试和解决这个问题吗?
编辑
所以显然我的测试脚本中的内存消耗是由于 /tmp 实际上是一个 RAM 驱动器,但是当写入通过以太网适配器连接的外部驱动器时问题仍然存在。
更新
写入物理驱动器上的本地文件夹时会重现该问题。这似乎是一个与 imwrite 无关的一般操作系统问题。操作系统缓存文件,但永远不会释放这个缓存(也许它“认为”它有足够的内存来进行所有这些缓存)。按照这里和这里的建议定期
执行目前是一个合理的解决方法,但我们想要一个不那么侵入/暴力的解决方案,它可以防止系统使用这么多缓存,或者让它在没有强制的情况下释放缓存。'echo 3 > /proc/sys/vm/drop_caches'
解决方案
看起来 /tmp 可能是某种 ramdisk 挂载,因此它可能会消耗 RAM,而不是磁盘空间,并在重新启动后清空。
https://wiki.archlinux.org/index.php/tmpfs
您可以通过针对不同目标文件夹测试您的脚本来确认它,例如将文件的存储定向到您的主目录。
推荐阅读
- macos - MAMP pro 正在缓存
- arrays - for循环内的VBA If语句未评估true
- openstack - Ubuntu 18.04 LTS 上的 Openstack 什么是合适的分支
- javascript - 如何使用带有可选参数命名的 Apply 调用函数?
- python - 如果在 Python 中的类中引发任何异常,请断开与服务器的连接
- python - 从两个 numpy 数组创建字典
- android - 如何在 Android 中集成 DialogFlow V2?
- stanford-nlp - 斯坦福 CoreNLP:引用注释器
- reactjs - 如何通过参数覆盖 Material UI 类
- spring - Spring Boot中的异常传播-微服务