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

Google Colab加载Drive大量小文件出现timeout错误如何解决

解决方案

问题根因

你当前使用的os.walk、glob都是基于Colab挂载的Google Drive FUSE虚拟文件系统实现的目录遍历,每一次目录查询、文件属性读取都会触发跨网的Drive API请求,15万小文件量级下请求量远超Drive的默认频率限制,必然触发超时错误。

可行方案

1. 直接调用Google Drive API列文件(最高效)

绕过挂载层直接调用原生Drive API查询,支持按后缀、父目录过滤,单次请求可返回1000条文件信息,内置分页逻辑,不会触发超时。
Colab环境下的示例代码如下:

from googleapiclient.discovery import build
from google.colab import auth
import os

# 按页面提示完成授权即可
auth.authenticate_user()
drive_service = build('drive', 'v3')

def list_drive_files(folder_id: str, extensions: list = [".png"]):
    """
    folder_id: 目标文件夹的Drive ID,在Drive网页端地址栏即可获取
    extensions: 要过滤的后缀列表
    """
    results = []
    page_token = None
    # 构造查询条件:指定父目录、未被删除、后缀匹配
    ext_query = " or ".join([f"name contains '{ext}'" for ext in extensions])
    query = f"'{folder_id}' in parents and trashed = false and ({ext_query})"

    while True:
        response = drive_service.files().list(
            q=query,
            spaces='drive',
            fields='nextPageToken, files(id, name, parents)',
            pageToken=page_token,
            pageSize=1000 # 单次拉取最大支持1000条,可降低避免触发限流
        ).execute()
        for file in response.get('files', []):
            # 可根据需求拼接为挂载路径,或直接用file.id访问文件
            results.append(file)
        page_token = response.get('nextPageToken', None)
        if page_token is None:
            break
    return results

该方法遍历15万文件通常2~3分钟即可完成,不会触发超时。

2. 提前打包批量文件

15万个64KB的文件总大小仅约9GB,完全可以提前在Google Drive端把整个文件夹打包为tar/zip包:

  • 方案A:把压缩包下载到Colab本地磁盘后解压,直接在本地磁盘遍历文件,速度提升10倍以上
  • 方案B:直接用zipfile/tarfile库读取Drive里的压缩包,不用解压就可以直接枚举包内的文件路径、读取文件内容,完全避免小文件遍历开销

3. 路径列表持久化缓存

第一次成功拉取到所有符合条件的文件路径后,直接把路径列表保存为pickle或者csv文件存储在Drive里,后续所有任务直接读这个缓存文件,不需要再次遍历目录,一劳永逸。

4. 分块遍历+重试兜底

如果一定要用挂载的文件系统遍历,把目标文件夹拆分为多个子文件夹,每个子文件夹单独遍历,每遍历完一个子文件夹加1~2秒的间隔,同时给遍历逻辑加重试装饰器,规避临时限流。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:45:04