在python中,GC如何处理mmap?

时间:2019-02-16 14:56:42

标签: python python-multiprocessing mmap numpy-memmap

我正在用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()

运行此代码不会显示任何内存问题。我还是想了解为什么。

0 个答案:

没有答案
相关问题