30

Azure Storage コンテナー内の BLOB の数をカウントする最も効率的な方法は何ですか?

今のところ、以下のコード以外の方法は考えられません。

CloudBlobContainer container = GetContainer("mycontainer");
var count = container.ListBlobs().Count();
4

10 に答える 10

14

ListBlobs() を使用してブロブをカウントしようとしましたが、約 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;
}

もちろん、これは、コンテナーが変更されるたびに ItemCount/CountUpdateTime を更新することを前提としています。CountUpdateTime はヒューリスティックなセーフガード (誰かが CountUpdateTime を更新せずにコンテナーが変更された場合、強制的に再カウントされます) ですが、信頼性は高くありません。

于 2011-12-21T00:09:49.400 に答える