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

无法将≥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库处理网络波动导致的临时错误(比如超时、服务不可用),自动重试,不用手动重启脚本。

额外排查点

  1. VM网络带宽:如果你的VM是低配机型,带宽不够的话大文件上传会很慢甚至失败,建议检查VM的网络配置。
  2. GCS配额限制:确认你的GCS项目没有触发上传速率配额限制,可以在GCP控制台的配额页面查看。
  3. 防火墙/代理:如果VM在有防火墙或代理的环境里,要确保允许GCS的域名(storage.googleapis.com)的长连接。

内容的提问来源于stack exchange,提问作者Shirley Peña

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:45:14