You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 03:25:29