gpt4 book ai didi

python - py3 中的 OpenCV Python : how to avoid cv2. imwrite() 内存 "leak"?

转载 作者:太空狗 更新时间:2023-10-29 12:09:35 26 4
gpt4 key购买 nike

我正在调查在 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' herehere目前是一个合理的解决方法,但我们想要一个侵入性/暴力程度较低的解决方案,可以防止系统使用太多缓存,或者无需强制即可释放缓存。

最佳答案

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

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

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

关于python - py3 中的 OpenCV Python : how to avoid cv2. imwrite() 内存 "leak"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50393741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com