无法将≥80GB的文件上传至Google Cloud Storage存储桶求助
解决GCS Python客户端上传超大文件失败的问题
嘿,这个问题我之前处理过!用默认的google-cloud-storage上传方法搞80GB+的大文件确实容易翻车——要么是内存扛不住(默认会尝试把文件读进内存),要么是单次请求超时、网络中断导致上传失败。咱们来针对性调整脚本:
核心解决方案:启用可恢复分块上传
GCS支持可恢复上传(Resumable Uploads),专门为大文件设计,即使中途断网也能从断点续传,而且会自动把文件拆分成小块逐个上传,避免单次请求过大。
修改后的脚本示例
import os import socket import logging from datetime import datetime from google.cloud import storage from google.api_core.exceptions import RequestTimeout, ServiceUnavailable from tenacity import retry, stop_after_attempt, wait_exponential # 配置日志,方便排查问题 logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def upload_large_file(bucket_name, source_file_path, destination_blob_path): # 给客户端设置更长的超时时间,大文件上传需要更久 storage_client = storage.Client(timeout=3600) bucket = storage_client.bucket(bucket_name) blob = bucket.blob(destination_blob_path) # 用重试机制处理网络波动导致的临时错误 @retry( stop=stop_after_attempt(5), # 最多重试5次 wait=wait_exponential(multiplier=1, min=4, max=10) # 指数退避等待,避免频繁重试 ) def perform_upload(): try: blob.upload_from_filename( source_file_path, resumable=True, # 启用可恢复上传 chunk_size=1024*1024*100, # 设置100MB的分块大小(可根据你的网络调整) timeout=3600 # 单个分块上传的超时时间 ) logger.info(f"✅ 文件 {source_file_path} 上传完成,目标路径: gs://{bucket_name}/{destination_blob_path}") except (RequestTimeout, ServiceUnavailable, socket.timeout) as e: logger.warning(f"⚠️ 上传遇到临时错误,将重试: {str(e)}") raise # 抛出异常触发重试 perform_upload() if __name__ == "__main__": today = datetime.today() current_hour = today.strftime('%Y/%m/%d/%H') # 替换成你的实际配置 BUCKET_NAME = "your-gcs-bucket-name" SOURCE_FILE = "/path/to/your/80gb+_file" DESTINATION_PATH = f"{current_hour}/{os.path.basename(SOURCE_FILE)}" upload_large_file(BUCKET_NAME, SOURCE_FILE, DESTINATION_PATH)
关键调整点说明
resumable=True:启用可恢复上传,GCS会生成一个上传会话URL,即使脚本中断,下次运行也能从上次的断点继续上传。chunk_size:手动设置分块大小(比如100MB),默认分块可能偏小(比如8MB),会导致请求过多;太大则容易超时。可以根据你的VM网络带宽调整(比如千兆网可以设到200MB)。- 超时设置:客户端和上传方法都设置了1小时超时,避免大文件上传到一半因为超时被中断。
- 重试机制:用
tenacity库处理网络波动导致的临时错误(比如超时、服务不可用),自动重试,不用手动重启脚本。
额外排查点
- VM网络带宽:如果你的VM是低配机型,带宽不够的话大文件上传会很慢甚至失败,建议检查VM的网络配置。
- GCS配额限制:确认你的GCS项目没有触发上传速率配额限制,可以在GCP控制台的配额页面查看。
- 防火墙/代理:如果VM在有防火墙或代理的环境里,要确保允许GCS的域名(
storage.googleapis.com)的长连接。
内容的提问来源于stack exchange,提问作者Shirley Peña
相关产品推荐
相关产品推荐

