如何高效可扩展计算ADLS Gen2文件夹大小并排除归档层Blob
解决ADLS Gen2文件夹大小计算(排除归档层Blob)的高效方案
针对百万级Blob规模的场景,推荐以下几种高效可扩展的实现方式:
1. 优化PowerShell命令(中小规模场景)
直接利用Get-AzStorageBlob返回的Blob属性进行过滤,无需额外API请求,性能优于逐个获取属性的方式:
# 初始化存储上下文 $ctx = New-AzStorageContext -StorageAccountName "your-storage-account" -StorageAccountKey "your-account-key" $containerName = "target-container" $folderName = "target-folder/" # 文件夹前缀需以斜杠结尾,确保匹配子目录 $totalSize = 0 # 获取指定前缀的Blob,过滤掉归档层后累加大小 Get-AzStorageBlob -Context $ctx -Container $containerName -Prefix $folderName | Where-Object { $_.AccessTier -ne "Archive" } | ForEach-Object { $totalSize += $_.Length } Write-Host "排除归档层后的总大小:$totalSize 字节"
2. 优化Python代码(中小规模场景)
避免逐个Blob请求属性,通过list_blobs的include参数直接获取访问层信息,减少API调用次数:
from azure.storage.blob import BlobServiceClient account_url = "https://your-storage-account.blob.core.windows.net" storage_account_key = "your-account-key" container_name = "target-container" folder_path = "target-folder/" blob_service_client = BlobServiceClient(account_url=account_url, credential=storage_account_key) container_client = blob_service_client.get_container_client(container_name) # 列表Blob时直接包含访问层信息,无需额外请求属性 blob_list = container_client.list_blobs(name_starts_with=folder_path, include=['tier']) total_size = 0 for blob in blob_list: if blob.blob_tier != "Archive": total_size += blob.size print(f"排除归档层后的总大小:{total_size} 字节")
3. 存储账户库存策略(超大规模场景,百万级Blob)
对于超大规模数据集,使用Azure存储账户的库存策略异步生成Blob清单,再分析计算大小:
- 登录Azure门户,进入目标存储账户,在「数据管理」下找到「库存策略」
- 创建新策略:指定目标容器、Blob类型,选择导出
AccessTier和ContentLength(即Size)属性,设置导出路径(同一存储账户下的容器) - 等待库存生成(根据数据量可能需要1-24小时),导出的文件为CSV或Parquet格式
- 用PowerShell、Python或数据分析工具读取文件,过滤掉
AccessTier为Archive的记录,对ContentLength求和
这种方式无需遍历所有Blob,完全异步处理,适合超大规模场景,可扩展性极强。
内容的提问来源于stack exchange,提问作者Nikesh
相关产品推荐
相关产品推荐

