我正在使用我的覆盆子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是覆盆子pi推荐的调用相机的方式。我知道这应该会在退出时关闭相机实例,但我猜有什么东西在内存中挂起了?我试着在函数的末尾添加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())发布于 2018-05-24 05:12:35
我假设您有一个包装python脚本,它导入问题中提供的脚本并在循环中调用ShutterTS。此函数不会将任何输出返回到主脚本(只返回return)。
如果您可以观察到内存泄漏,那么它可能位于picamera模块中。解决方法是将此脚本作为子进程调用,而不是作为主进程中的函数调用。它可以在shell脚本中完成,也可以使用subprocess模块在python脚本中完成。
因此,内存将在每次捕获后释放。
https://stackoverflow.com/questions/50497280
复制相似问题