我正在使用我的覆盆子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())
答案 0 :(得分:0)
我想你有一个包装python脚本,它导入你在问题中提供的脚本并在循环中调用ShutterTS
。此函数不会向主脚本返回任何输出(仅return
)。
如果你可以观察到内存泄漏,它可能位于picamera模块中。 解决方法是将此脚本称为子进程,而不是作为主进程中的函数调用。它可以使用subprocess模块在shell脚本或python脚本中完成。
因此,每次捕获后都会释放内存。