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

