如何从Azure Storage直接下载大Blob到本地文件避免内存占用过高
Azure Storage 大体积 Blob 低内存下载方案
官方入门示例使用readall()的实现确实仅适用于小文件场景,下载数百GB级大文件时会直接占满内存。Azure Blob Storage Python v12+ 版本SDK本身已经内置了流式分块下载能力,不需要手动实现复杂的分块逻辑,内存中仅会缓存当前下载的块内容,不会加载全量文件。
实现代码
import os from azure.storage.blob import BlobServiceClient # 替换为实际配置信息 storage_connection_str = "你的存储账号连接字符串" target_container_name = "目标容器名" target_blob_name = "要下载的大Blob名称" local_save_path = "本地文件保存路径" # 初始化Blob客户端 blob_service_client = BlobServiceClient.from_connection_string(storage_connection_str) blob_client = blob_service_client.get_blob_client( container=target_container_name, blob=target_blob_name ) print(f"开始下载Blob到: {local_save_path}") with open(local_save_path, "wb") as local_f: # 初始化下载流,可通过max_concurrency调整并行下载块数提升速度 downloader = blob_client.download_blob(max_concurrency=4) # 自动分块写入本地文件,内存常驻仅为单块大小(默认4MB/块) downloader.readinto(local_f)
可选自定义配置
如果需要手动调整块大小、自定义下载逻辑,也可以直接迭代下载流的块内容:
# 自定义单块大小为8MB chunk_size = 8 * 1024 * 1024 with open(local_save_path, "wb") as local_f: downloader = blob_client.download_blob(max_concurrency=4) for chunk in downloader.chunks(chunk_size=chunk_size): local_f.write(chunk)
注意事项
- 请使用12.x及以上版本的
azure-storage-blob包,旧的v2版本SDK接口不兼容且已停止维护,升级命令为pip install --upgrade azure-storage-blob - 峰值内存占用 = 单块大小 * 并发数,例:8MB块大小+8并发的配置下,峰值内存占用仅为64MB,完全适配TB级大文件下载场景
- SDK内置了网络异常重试、块校验逻辑,不需要额外处理常规网络波动问题;如果需要断点续传,可以记录已下载的字节偏移量,调用
download_blob()时传入offset参数即可从断点位置继续下载。
内容的提问来源于stack exchange,提问作者nrofis
相关产品推荐
相关产品推荐

