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
相关产品推荐
相关产品推荐

