В Python, как GC обрабатывает mmap?
Я пишу многопроцессорную систему на 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()
Запуск этого кода не показывает никаких проблем с памятью. Тем не менее, я хотел бы понять, почему.