在Azure存储容器中获取blob计数

bre*_*oon 17 azure azure-storage azure-storage-blobs

获取Azure存储容器中Blob数量的最有效方法是什么?

现在除了下面的代码,我想不出任何其他方式:

CloudBlobContainer container = GetContainer("mycontainer");
var count = container.ListBlobs().Count();
Run Code Online (Sandbox Code Playgroud)

小智 16

如果您只想知道容器中有多少blob而不编写代码,则可以使用Microsoft Azure Storage Explorer应用程序.

  1. 打开所需的BlobContainer 在此输入图像描述
  2. 单击"文件夹统计"图标 在此输入图像描述
  3. 观察"活动"窗口中的斑点数 在此输入图像描述

  • 统计信息仅适用于普通存储帐户。如果激活 ADLS Gen2,它们不可用。 (3认同)

Dav*_*yan 13

我尝试使用ListBlobs()对blob进行计数,对于一个包含大约400,000个项目的容器,我花了5分多钟.

如果您可以完全控制容器(即控制何时发生写入),则可以在容器元数据中缓存大小信息,并在每次删除或插入项目时更新它.这是一段将返回容器blob计数的代码:

static int CountBlobs(string storageAccount, string containerId)
{
    CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(storageAccount);
    CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient();
    CloudBlobContainer cloudBlobContainer = blobClient.GetContainerReference(containerId);

    cloudBlobContainer.FetchAttributes();

    string count = cloudBlobContainer.Metadata["ItemCount"];
    string countUpdateTime = cloudBlobContainer.Metadata["CountUpdateTime"];

    bool recountNeeded = false;

    if (String.IsNullOrEmpty(count) || String.IsNullOrEmpty(countUpdateTime))
    {
        recountNeeded = true;
    }
    else
    {
        DateTime dateTime = new DateTime(long.Parse(countUpdateTime));

        // Are we close to the last modified time?
        if (Math.Abs(dateTime.Subtract(cloudBlobContainer.Properties.LastModifiedUtc).TotalSeconds) > 5) {
            recountNeeded = true;
        }
    }

    int blobCount;
    if (recountNeeded)
    {
        blobCount = 0;
        BlobRequestOptions options = new BlobRequestOptions();
        options.BlobListingDetails = BlobListingDetails.Metadata;

        foreach (IListBlobItem item in cloudBlobContainer.ListBlobs(options))
        {
            blobCount++;
        }

        cloudBlobContainer.Metadata.Set("ItemCount", blobCount.ToString());
        cloudBlobContainer.Metadata.Set("CountUpdateTime", DateTime.Now.Ticks.ToString());
        cloudBlobContainer.SetMetadata();
    }
    else
    {
        blobCount = int.Parse(count);
    }

    return blobCount;
}
Run Code Online (Sandbox Code Playgroud)

当然,这假定您每次修改容器时都更新ItemCount/CountUpdateTime.CountUpdateTime是一种启发式安全措施(如果容器确实被修改而没有人更新CountUpdateTime,这将强制重新计数)但它不可靠.


Dav*_*gon 11

API不包含容器计数方法或属性,因此您需要执行类似于发布的操作.但是,如果超过5,000个项目返回(或者如果指定max#返回且列表超过该数量),则需要处理NextMarker.然后你将根据NextMarker进行add'l调用并添加计数.

编辑:Per smarx:SDK应该为您处理NextMarker.如果您在API级别工作,通过REST 调用List Blob,则需要处理NextMarker .

另外,如果你控制BLOB插入/缺失(通过WCF服务,例如),您可以使用BLOB容器的元数据区来存储您每次插入计算或删除缓存容器计数.您只需要处理容器的写并发性.