Python малина Pi утечка памяти замедленная? - PullRequest
0 голосов
/ 23 мая 2018

Я использую свой 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())

Снимок экрана использования памяти

1 Ответ

0 голосов
/ 24 мая 2018

Полагаю, у вас есть сценарий Python для переноса, который импортирует сценарий, который вы указали в вопросе, и вызывает ShutterTS в цикле.Эта функция не возвращает никакого вывода в основной скрипт (только return).

Если вы можете наблюдать утечку памяти, она, вероятно, находится в модуле picamera.Обходной путь - вызывать этот сценарий как подпроцесс, а не как вызов функции в основном процессе.Это можно сделать в сценарии оболочки или в сценарии python с использованием модуля subprocess .

Таким образом, память будет освобождаться после каждого захвата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...