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

如何解决Azure Function Blob触发器触发Stream Too Long错误问题

Azure Blob触发型Function处理大文件报错解决方案

错误根因

你遇到的两类报错本质都和Azure Function Python运行时的Blob输入绑定默认行为有关:

  • 退出码137是Linux系统下进程因内存占用过高被OOM Killer强制终止的信号
  • Stream was too long是Python运行时默认加载全量Blob内容到内存触发的流长度限制
    注意:哪怕你代码里没有读取Blob流的逻辑,只要你把触发参数声明为func.InputStream类型,Function运行时在调用你的代码前就会自动把整个Blob的全量内容加载到内存中,所以才会出现仅打印日志也报错的情况,该问题和实例SKU规格无直接关联。

解决方案

  • 第一步:修改Blob触发绑定配置,避免自动加载Blob内容

    不要将触发参数声明为func.InputStream,改为仅接收Blob的名称字符串,运行时只会传递Blob的元数据信息,不会预加载Blob内容,从根源避免内存溢出。
    参考function.json配置:
    {
      "scriptFile": "__init__.py",
      "bindings": [
        {
          "name": "blob_name",
          "type": "blobTrigger",
          "direction": "in",
          "path": "需监听的容器名称/{blob_name}",
          "connection": "Azure Storage连接字符串对应的配置项名称"
        }
      ]
    }
    
  • 第二步:使用对应SDK实现流式同步

    分别调用Azure Blob Storage SDK和GCP Cloud Storage SDK,采用分片流式传输的方式完成同步,全程不将全量文件加载到内存,内存占用可以稳定控制在分片大小的量级。
    参考Python实现代码:
    import logging
    import os
    import azure.functions as func
    from azure.storage.blob import BlobServiceClient
    from google.cloud import storage
    
    def main(blob_name: str):
        logging.info(f"触发新Blob同步,名称:{blob_name}")
        # 从应用配置读取连接信息,不要硬编码
        az_conn_str = os.environ["AZURE_STORAGE_CONN_STR"]
        gcs_bucket_name = os.environ["GCS_BUCKET_NAME"]
        az_container_name = os.environ["AZURE_CONTAINER_NAME"]
        
        # 初始化Azure Blob客户端
        az_blob_service = BlobServiceClient.from_connection_string(az_conn_str)
        blob_client = az_blob_service.get_blob_client(container=az_container_name, blob=blob_name)
        # 初始化GCS客户端
        gcs_client = storage.Client()
        gcs_bucket = gcs_client.bucket(gcs_bucket_name)
        gcs_blob = gcs_bucket.blob(blob_name)
        
        # 流式分片上传,内存占用仅和分片大小相关
        with blob_client.download_blob() as az_stream:
            gcs_blob.upload_from_file(az_stream, chunksize=10*1024*1024) # 分片大小可按需调整,此处为10MB
        logging.info(f"Blob {blob_name} 同步完成")
    
  • 第三步:调整Function运行配置适配大文件场景

    • 若使用弹性Premium/专用宿主计划,可将函数超时时间调整到最长60分钟(消费计划默认最长5分钟,最大支持10分钟),避免大文件传输过程中被强制中断
    • 适当调高函数实例的内存配置,建议2G以上,避免峰值传输时内存不足

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:45:09