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

Google Colab中手动垃圾回收机制失效问题求助

解决Colab加载大文件内存溢出问题

核心问题分析

Colab的内存管理机制和本地机器存在差异,手动gc.collect()无法立即回收内存的原因主要包括:

  • np.load默认会将整个文件加载到内存,即便你只需要其中一个切片
  • 预分配的slices数组叠加临时加载的snapshot,再加上Colab后台服务的内存开销,会快速触发内存阈值
  • 循环中可能存在未被及时回收的隐式引用(比如tqdm的内部缓存)

具体解决方案

1. 使用内存映射加载文件(最有效)

通过np.load的mmap_mode='r'参数,将文件映射到磁盘而非全部加载到内存,仅读取需要的切片,大幅降低内存占用:

import numpy as np
from tqdm import tqdm

selected_id = 5
slices_list = []
for k, file_path in enumerate(tqdm(file_list)):  
    # 内存映射加载,仅读取目标切片
    with np.load(file_path, mmap_mode='r') as snapshot:
        slice_data = snapshot[selected_id] - mean
        slices_list.append(slice_data)
# 最后统一转换为numpy数组
slices = np.array(slices_list)

2. 优化数组预分配与临时变量

如果必须预分配数组,确保操作时不产生额外的大临时数组:

import numpy as np
from tqdm import tqdm
import gc

selected_id = 5
# 指定dtype为float32(精度允许时),直接减少一半内存占用
slices = np.zeros([len(file_list), n, m], dtype=np.float32) 
for k, file_path in enumerate(tqdm(file_list)):  
    # 加载后直接取切片赋值,避免保留整个snapshot对象
    slices[k] = np.load(file_path)[selected_id] - mean
    gc.collect()

3. 检查数据类型一致性

  • 确认mean的数据类型与snapshot完全一致,避免类型转换产生临时数组
  • 若无需高精度,将所有数组统一为float32类型,进一步压缩内存占用

额外注意事项

  • Colab的高RAM选项显示的25GB为总内存,实际可用内存会被后台服务占用一部分,实际可用空间可能低于本地机器
  • 循环中尽量避免创建不必要的中间变量,所有操作优先原地完成

内容的提问来源于stack exchange,提问作者Lac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:33:26