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应用程序.
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,这将强制重新计数)但它不可靠.
| 归档时间: |
|
| 查看次数: |
17066 次 |
| 最近记录: |