Python覆盆子Pi间隔时间内存泄漏?

时间:2018-05-23 20:51:51

标签: python memory memory-leaks raspberry-pi

我正在使用我的覆盆子Pi3制作间隔拍摄视频。我有一个cron,它每分钟运行一个python脚本,决定拍摄多少张照片,然后从另一个拍摄实际照片的python脚本中导入一个函数。问题是,在运行了大约4个小时后,相机停止拍照 - 如果我尝试手动拍摄一张照片就说它内存不足,top确认了这一点。如果我在游戏中时光倒流正在运行时观看top,则内存使用量会稳步攀升。

我想我已经把问题缩小到拍摄照片的python脚本了。我可以单独运行它,如果我启动pi并运行它几次,我看到使用的内存在第一次运行时增加了大约10MB,每次后续运行时增加了大约1MB(在帖子底部截屏)。这是脚本

import time
import picamera
import os

def ShutterTS(dirname):
    with picamera.PiCamera() as cam:
        cam.resolution=(1920,1440)
        cam.rotation=180
        cam.hflip=True
        # camera warm up time
        time.sleep(2)  
        FNfmt = "%4d%02d%02d_%02d:%02d:%02d.JPG"
        Fname = FNfmt % time.localtime()[0:6]
        framename = os.path.join(dirname, Fname)
        cam.capture(framename)
        return

def main():
    dirname = [insert path here, my path hidden]
    ShutterTS(dirname)
    return

if __name__ == '__main__':
    import sys
    sys.exit(main())

我不是一个好的程序员,我基本上把我在互联网上找到的东西拼凑在一起,所以我希望这是我错过的非常简单的东西。 with是树莓派推荐的调用相机的方法。我知道这应该在退出时关闭相机实例,但我猜测内存中有什么东西在挂?我尝试在函数末尾添加close.cam()并且它没有任何区别(不认为它会)。我已经对函数末尾的所有变量尝试了del,并没有区别。我认为函数末尾的return是多余的,但添加它没有任何区别。

这个网站https://www.linuxatemyram.com/表明显示内存攀升的top是正常的,free -m是更好的衡量标准,并显示有足够的​​可用性 - 但事实仍然是相机停止工作,说它是内存不足。任何线索都会非常感激!

这是cron脚本(其他一些导入的裁剪)

from ShutterTimestamp import ShutterTS
from makedirectory import testmakedir
from SunTimesA import gettimes

def Timer(dirname,FRAMES_PER_MINUTE):
    # I take a picture first and then loop so the program isn't
    # sleeping pointlessly to the end of the minute
    start = time.time()
    ShutterTS(dirname)
    if FRAMES_PER_MINUTE>1:
        for frame in range(FRAMES_PER_MINUTE-1):
            time.sleep(int(60 / FRAMES_PER_MINUTE) - (time.time() - start))
            start = time.time()
            ShutterTS(dirname)
    return

def main():
    dirfmt = []
    dirname = dirfmt % time.localtime()[0:3]
    FPM=gettimes()
    if FPM > 0:
        testmakedir(dirname)
        Timer(dirname,FPM)
    return

if __name__ == '__main__':
    sys.exit(main())

Screenshot of memory use

1 个答案:

答案 0 :(得分:0)

我想你有一个包装python脚本,它导入你在问题中提供的脚本并在循环中调用ShutterTS。此函数不会向主脚本返回任何输出(仅return)。

如果你可以观察到内存泄漏,它可能位于picamera模块中。 解决方法是将此脚本称为子​​进程,而不是作为主进程中的函数调用。它可以使用subprocess模块在​​shell脚本或python脚本中完成。

因此,每次捕获后都会释放内存。