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

如何用Python SDK流式处理Azure Blob,避免全量加载至内存?

解决方案:流式处理Azure Blob中的压缩BSON文件

你可以通过Azure Blob Storage Python SDK的流式下载能力,结合gzip.GzipFile和bson.decode_file_iter实现全流式处理,无需全量加载内存或手动分块,也不用先下载到本地文件。

核心思路

  1. 使用BlobClient.download_blob()获取流式下载对象,该对象支持按需读取Blob内容,不会一次性加载整个文件到内存。
  2. 将流式下载对象直接传入gzip.GzipFile,实现流式解压缩(gzip会自动按需读取数据)。
  3. 将解压缩后的流直接传给bson.decode_file_iter,它会从流中逐个解析BSON文档,内存仅占用单个文档的大小。

代码示例

from azure.storage.blob import BlobClient
import gzip
import bson

# 初始化Blob客户端
blob_client = BlobClient.from_connection_string(
    conn_str="你的Azure存储连接字符串",
    container_name="目标容器名",
    blob_name="压缩的BSON文件名(如dump.gz)"
)

# 获取流式下载器(不要调用readall()或readinto()全量读取)
download_stream = blob_client.download_blob()

# 流式解压缩并解析BSON文档
with gzip.GzipFile(fileobj=download_stream, mode='rb') as gz_stream:
    for document in bson.decode_file_iter(gz_stream):
        # 在这里处理单个BSON文档,比如写入数据库或做业务逻辑
        print(document)

为什么这个方案可行

  • download_blob()返回的StorageStreamDownloader是标准的类文件对象,实现了read(size)方法:当gzip或bson迭代器需要数据时,会自动调用该方法读取合适的块大小,无需手动管理offset和limit。
  • 整个流程是端到端流式处理:Blob数据从Azure服务器逐步下载,逐步解压缩,逐步解析为BSON文档,内存占用始终保持在较低水平(仅取决于单个BSON文档的大小),完全适配256MB内存的容器环境,也能处理解压后500GB的超大文件。
  • 无需编写复杂的转换层,仅用Python标准库和Azure SDK的现有功能即可完成。

注意事项

  • 确保使用的azure-storage-blob版本>=12.0(最新稳定版即可),旧版本的API结构不同。
  • 如果Blob是加密存储的,需确保BlobClient已配置好对应的解密参数,否则流式读取会失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 23:32:42