如何从Azure Blob容器快速下载CSV指定的百万级文件?
快速批量下载Azure Blob中指定文件的优化方案
针对你要下载3百万个无规整路径Blob的场景,以下是比现有方案更快的实现方式:
1. 使用Azcopy批量下载(首选)
Azcopy是微软官方专为Azure存储优化的传输工具,内置了并发调度、断点续传、网络自适应等机制,性能远优于自行编写的Python脚本。
- 操作步骤:
- 将CSV中的Blob路径整理为每行一个路径的文本文件(确保路径是Blob的相对路径,不含容器名)
- 生成容器级SAS令牌(比单个Blob SAS更高效,避免重复生成开销)
- 执行下载命令:
azcopy copy "https://<storage-account>.blob.core.windows.net/<container>" "<本地目标目录>" --list-of-files "<你的路径列表文件路径>" --sas-token "<容器级SAS>"
- 优势:自动优化并发数、处理网络波动、支持增量下载,单进程就能榨干带宽,无需手动维护线程/进程池。
2. 多进程+异步HTTP请求(替代方案)
Python的多线程受GIL限制,无法充分利用CPU和网络资源,改用多进程+异步IO能大幅提升并发量:
- 用
multiprocessing将CSV文件拆分为多个子批次,每个进程独立处理一个批次 - 每个进程内使用
aiohttp发起异步HTTP请求,替代requests的同步请求 - 提前生成容器级SAS,每个请求直接拼接SAS令牌,避免单个Blob SAS的生成开销
3. 异步Azure Blob SDK优化
如果你倾向于用SDK而非第三方工具,试试异步版本的Azure Blob SDK:
- 安装异步包:
pip install azure-storage-blob[aio] - 用
asyncio构建高并发任务队列,批量发起异步下载请求 - 配合容器级SAS或服务主体认证,减少单个请求的权限验证耗时
额外优化点
- 同区域部署:确保虚拟机和存储账户在同一Azure区域,使用内网传输(无需公网带宽费用,延迟更低)
- 本地存储优化:目标目录挂载SSD,避免磁盘IO成为下载瓶颈
- 并发数调优:根据虚拟机CPU/内存和存储账户限额调整并发数(Azcopy会自动调整,自行编写脚本建议从100-200并发开始测试)
- 禁用代理:确保虚拟机未启用HTTP代理,避免额外延迟
内容的提问来源于stack exchange,提问作者Vicki
相关产品推荐
相关产品推荐

