Я использую свой Raspberry Pi3 для создания замедленных видео.У меня есть cron, который запускает скрипт python каждую минуту, который решает, сколько фотографий сделать, а затем импортирует функцию из другого скрипта python, который делает реальные фотографии.Проблема в том, что после работы в течение примерно 4 часов камера перестает делать фотографии - если я пытаюсь сделать один вручную, он говорит, что ему не хватает памяти, и top
подтверждает это.Если я смотрю top
, пока работает timelapse, использование памяти постоянно растет.
Я думаю, что я сузил проблему до сценария python, который делает фотографии.Я могу запустить его сам по себе, и если я запускаю pi и запускаю его несколько раз, я вижу, что память использовала подъемы примерно на 10 МБ при первом запуске и примерно на 1 МБ при каждом последующем запуске (скриншот внизу поста).Это сценарий
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
- рекомендуемый способ вызова камеры с помощью Raspberry 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())
Снимок экрана использования памяти