Python多进程结合OpenCV使用Queue致内存占用过高问题排查
问题:多进程结合OpenCV读取视频帧导致内存占满
场景与代码
我用Python的multiprocessing结合OpenCV实现视频帧的生产消费:
生产者类代码
import cv2 from multiprocessing import Process, Queue class StreamVideos: def __init__(self): self.image_data = Queue() def start_proces(self): p = Process(target=self.echo) p.start() def echo(self): cap = cv2.VideoCapture('videoplayback.mp4') while cap.isOpened(): ret,frame = cap.read() self.image_data.put(frame) # print("frame")
启动生产者与消费者的代码
self.obj = StreamVideos() def start_process(self): self.obj.start_proces() p = Process(target=self.stream_videos) p.start() def stream_videos(self): while True: self.img = self.obj.image_data.get() print(self.img)
现象与尝试
- 视频参数:25fps、39MB大小,但启动后内存迅速占满导致系统卡顿
- 观察到生产者存帧速度远快于消费者取帧速度
- 已尝试:不将帧放入Queue时,内存不会占满
问题
请问该问题的根源是什么?
解答
问题根源很明确:multiprocessing.Queue默认没有容量限制,生产者进程读取视频帧的速度远高于消费者处理(此处仅为打印)的速度,导致大量未处理的视频帧数据持续堆积在队列中。
每帧OpenCV读取的frame是numpy数组,本身占用不小的内存,当队列里的帧数量不断增长,内存会被快速耗尽,最终导致系统卡顿。
另外补充:你的生产者代码未判断ret的返回值,当视频读取完毕(ret为False)时,还会继续向队列放入None,这也会额外占用不必要的资源。
内容的提问来源于stack exchange,提问作者Muhammad Tariq
相关产品推荐
相关产品推荐

