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

Colab中使用PyTorchVideo加载视频RAM占用持续攀升且无法释放问题

解决PyTorchVideo循环加载视频时的内存泄漏问题

问题原因

循环中反复创建EncodedVideo实例会导致内存持续攀升,核心原因包括:

  • EncodedVideo内部依赖的视频读取器持有底层FFmpeg资源或未被Python垃圾回收器追踪的C级句柄,直接del无法释放这类资源。
  • 实例内部可能存在循环引用,导致Python GC无法自动清理对象。

可行解决方案

1. 复用EncodedVideo实例(最优方案)

无需每次循环都创建新实例,将初始化逻辑移到循环外,避免重复分配资源:

from pytorchvideo.data.encoded_video import EncodedVideo
from pathlib import Path
import gc

path = Path('path/to/video')
# 仅初始化一次视频读取实例
video = EncodedVideo.from_path(path)

while True:
    video_data = video.get_clip(0, 5)
    # 此处添加video_data的处理逻辑
    
    # 显式清理张量并触发垃圾回收
    del video_data
    gc.collect()

2. 显式关闭底层视频读取器

如果必须在循环内创建实例,需手动关闭内部读取器以释放资源:

from pytorchvideo.data.encoded_video import EncodedVideo
from pathlib import Path
import gc

path = Path('path/to/video')

while True:
    video = EncodedVideo.from_path(path)
    video_data = video.get_clip(0, 5)
    # 此处添加video_data的处理逻辑
    
    # 关闭底层读取器(注意:访问内部属性需关注版本兼容性)
    video._video_reader.close()
    # 清理所有相关对象
    del video_data
    del video
    gc.collect()

3. 直接使用VideoReader(更细粒度控制)

VideoReader提供公开的close()方法,可更可靠地释放资源:

from pytorchvideo.data.video_reader import VideoReader
from pathlib import Path
import gc

path = Path('path/to/video')

while True:
    reader = VideoReader(path)
    # 定位到视频起始位置(单位:秒)
    reader.seek(0.0)
    # 读取0-5秒的帧数据
    video_data = reader.read(end_sec=5.0)
    # 此处添加video_data的处理逻辑
    
    # 关闭读取器
    reader.close()
    # 清理所有相关对象
    del video_data
    del reader
    gc.collect()

注意事项

  • 避免在循环中重复初始化视频读取类,这是引发内存泄漏的最常见操作。
  • 若使用GPU,需额外调用torch.cuda.empty_cache()清理显存,但此问题针对CPU内存,可忽略该步骤。

内容的提问来源于stack exchange,提问作者K.XGai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 11:07:16