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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 13:35:13