如何从Azure Storage容器分批获取指定数量的Blob?
问题:Azure Storage 分批获取指定数量Blob避免全量拉取
我通过API调用返回的Blob列表超过10000个,希望循环调用API每次返回100个Blob直至获取完成,这样后台加载剩余文件时就能先使用已获取的文件。目前我的代码会先获取全部10000个Blob再截取部分返回,想问下能不能直接从Azure Storage获取所需的指定数量Blob,避免每次全量拉取?
以下是我的代码:
var container = GetContainer(prof.Container, dataCenterId); var blobList = container.GetBlobs(prefix: prefix); // blobList 包含全部10000个Blob,我只需要其中n个文件的部分 foreach(var b in blobList) { if(fileList.Count() < nFilesToReturn) { fileNames.Add(b.Name); } else { return fileNames; } }
当然可行,Azure Storage Blob API支持分页获取指定数量的Blob,不需要全量拉取所有数据。你可以通过以下方式实现:
1. 异步分页分批获取(推荐)
使用BlobContainerClient.GetBlobsAsync结合AsPages方法,指定每页返回的数量,同时可以在每获取一批数据后立即处理,实现后台加载的需求:
public async Task<List<string>> GetBlobsInBatches(string containerName, string prefix, int batchSize = 100) { var container = GetContainer(containerName, dataCenterId); var fileNames = new List<string>(); // 指定每页返回的Blob数量,触发分页查询 var pageable = container.GetBlobsAsync(prefix: prefix) .AsPages(pageSizeHint: batchSize); await foreach (var page in pageable) { foreach (var blob in page.Values) { fileNames.Add(blob.Name); // 如果已获取到需要的数量,提前退出 if (fileNames.Count >= nFilesToReturn) { return fileNames; } } // 这里可以加入后台处理逻辑,比如将当前批次的Blob返回给前端使用 ProcessBatch(fileNames); } return fileNames; }
2. 同步方式分页处理
如果需要同步代码,同样可以使用AsPages的同步版本逐步遍历:
public List<string> GetBlobsInBatchesSync(string containerName, string prefix, int batchSize = 100) { var container = GetContainer(containerName, dataCenterId); var fileNames = new List<string>(); var pageable = container.GetBlobs(prefix: prefix) .AsPages(pageSizeHint: batchSize); foreach (var page in pageable) { foreach (var blob in page.Values) { fileNames.Add(blob.Name); if (fileNames.Count >= nFilesToReturn) { return fileNames; } } ProcessBatch(fileNames); } return fileNames; }
关键说明
pageSizeHint参数用于指定每页返回的Blob数量,Azure Storage会尽量返回该数量的结果,实际返回可能略有浮动- 分页查询时,每次API调用只会拉取当前页的Blob数据,不会一次性加载全部10000个,大幅降低内存占用和网络开销
- 每获取一页数据后即可立即处理,完全符合你"后台加载剩余文件时即可使用已获取文件"的需求
内容的提问来源于stack exchange,提问作者Pendonep
相关产品推荐
相关产品推荐

