Azure Storage コンテナー内の BLOB の数をカウントする最も効率的な方法は何ですか?
今のところ、以下のコード以外の方法は考えられません。
CloudBlobContainer container = GetContainer("mycontainer");
var count = container.ListBlobs().Count();
Azure Storage コンテナー内の BLOB の数をカウントする最も効率的な方法は何ですか?
今のところ、以下のコード以外の方法は考えられません。
CloudBlobContainer container = GetContainer("mycontainer");
var count = container.ListBlobs().Count();
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 を更新せずにコンテナーが変更された場合、強制的に再カウントされます) ですが、信頼性は高くありません。