В Python, как GC обрабатывает mmap? - PullRequest
0 голосов
/ 16 февраля 2019

Я пишу многопроцессорную систему на Python.Один из дочерних процессов отвечает за чтение кадров из потока камеры, используя cv2, и передает этот кадр другому дочернему процессу для некоторой манипуляции и предварительного просмотра.Проблема в том, что для передачи сообщений от одного процесса другому я использую модуль 'pickle' для сериализации объектов сообщений.Время здесь имеет решающее значение, поэтому вместо использования массива numpy для каждого кадра, который будет сериализован, я использую numpy.memmap.Я пытаюсь понять, как python будет обрабатывать память, созданную memmap.Что произойдет, если объект чтения потока больше не будет сохранять ссылку на объект memmap (после того, как он будет выбран и отправлен).Может ли кадр быть освобожден из памяти?Если нет, то я сталкиваюсь с проблемой памяти?Как бы Python узнал, когда фрейм больше не используется, и удалил его?

Пример кода:

import cv2
import numpy as np
from multiprocessing import Queue, Process
import pickle


def second_child_process(queue):

    while True:
        pickled_frame = queue.get()
        fp = pickle.loads(pickled_frame)
        cv2.imshow("Video Window", fp)
        cv2.waitKey(33)


def first_child_process(queue):
    ret = True
    vc = cv2.VideoCapture("/dev/0")
    while (ret):

        memmap_p = np.memmap("/dev/zero", dtype='uint8', mode='w+', shape=(360, 640, 3))
        ret = vc.read(memmap_p)

        p = pickle.dumps(memmap_p)
        queue.put(p)


if __name__ == '__main__':
    queue = Queue(10)
    process1 = Process(target=first_child_process, args=(queue,))
    process2 = Process(target=second_child_process, args=(queue,))

    process1.start()
    process2.start()
    process1.join()

Запуск этого кода не вызывает проблем с памятью.Тем не менее, я хотел бы понять, почему.

...