मैंने ListBlobs() का उपयोग करके ब्लॉब्स गिनने की कोशिश की और लगभग 400,000 वस्तुओं वाले कंटेनर के लिए, मुझे 5 मिनट से अधिक समय लगा।
यदि आपके पास कंटेनर पर पूर्ण नियंत्रण है (यानी, जब आप लिखते हैं तो आप नियंत्रण करते हैं), तो आप कंटेनर मेटाडेटा में आकार की जानकारी को कैश कर सकते हैं और प्रत्येक आइटम को हटा या डालने पर इसे अपडेट कर सकते हैं।
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 एक ह्युरिस्टिक सुरक्षा है (यदि कंटेनर को अद्यतन अपडेटाइमटाइम अपडेट किए बिना संशोधित किया गया है, तो यह फिर से गिनती करेगा) लेकिन यह विश्वसनीय नहीं है।
स्रोत
2011-12-21 00:09:49
मैं यकीन है कि ListBlobs स्वचालित रूप से पालन करेंगे कर रहा हूँ निरंतर टोकन। (इसलिए मुझे नहीं लगता कि आपको इसे काम करने के लिए नेक्स्टमार्कर के साथ कुछ भी स्पष्ट करने की आवश्यकता है।) – smarx
ओह! मैं एपीआई स्तर पर बहुत अधिक समय बिता रहा हूं, ऐसा लगता है ... :) –