2011-07-28 8 views
9

एज़ूर स्टोरेज कंटेनर में ब्लॉब्स की संख्या पर गिनती करने का सबसे प्रभावी तरीका क्या है?एज़ूर स्टोरेज कंटेनर में ब्लॉब गिनती प्राप्त करना

अभी मैं नीचे दिए गए कोड के अलावा अन्य किसी भी तरह से नहीं सोच सकते हैं:

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

उत्तर

10

एपीआई एक कंटेनर गणना विधि या संपत्ति शामिल नहीं करता है, तो आप की तरह कुछ करने के लिए आवश्यकता होगी क्या आपने पोस्ट किया हालांकि, अगर आप लौटे 5,000 आइटम से अधिक हो जाते हैं तो आपको नेक्स्टमार्कर से निपटने की आवश्यकता होगी (या यदि आप वापसी के लिए अधिकतम # निर्दिष्ट करते हैं और सूची उस संख्या से अधिक है)। फिर आप NextMarker के आधार पर ऐड कॉल कर सकते हैं और गणना जोड़ सकते हैं।

संपादित करें: प्रति smarx: एसडीके को आपके लिए नेक्स्टमार्कर का ख्याल रखना चाहिए। यदि आप एपीआई स्तर पर काम कर रहे हैं तो आपको नेक्स्टमार्कर से निपटने की आवश्यकता होगी, List Blobs को आरईएसटी के माध्यम से कॉल करना होगा।

वैकल्पिक रूप से, यदि आप ब्लॉब सम्मिलन/हटाना (उदाहरण के लिए, एक डब्ल्यूसीएफ सेवा के माध्यम से) को नियंत्रित कर रहे हैं, तो आप एक सम्मिलित कंटेनर गिनती को संग्रहीत करने के लिए ब्लॉब कंटेनर मेटाडेटा क्षेत्र का उपयोग कर सकते हैं जिसे आप प्रत्येक सम्मिलित या हटाते हैं। आपको कंटेनर को लिखने की समरूपता से निपटने की आवश्यकता होगी।

+0

मैं यकीन है कि ListBlobs स्वचालित रूप से पालन करेंगे कर रहा हूँ निरंतर टोकन। (इसलिए मुझे नहीं लगता कि आपको इसे काम करने के लिए नेक्स्टमार्कर के साथ कुछ भी स्पष्ट करने की आवश्यकता है।) – smarx

+0

ओह! मैं एपीआई स्तर पर बहुत अधिक समय बिता रहा हूं, ऐसा लगता है ... :) –

8

मैंने 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 एक ह्युरिस्टिक सुरक्षा है (यदि कंटेनर को अद्यतन अपडेटाइमटाइम अपडेट किए बिना संशोधित किया गया है, तो यह फिर से गिनती करेगा) लेकिन यह विश्वसनीय नहीं है।

+1

यदि यह दृष्टिकोण एक सिस्टम में उपयोग किया जाता है जहां कॉल समानांतर में निष्पादित किया जा सकता है उदा। एक वेब एपीआई तब आप दौड़ की स्थिति में भाग लेते हैं जो पिछले अद्यतन मूल्यों के आसपास है। एक और दृष्टिकोण फ़ाइल नामों को एक एज़ूर स्टोरेज तालिका में एक इंडेक्स के रूप में स्टोर करना हो सकता है। –

+0

ठीक है, शायद स्टोरेज टेबल्स नहीं है क्योंकि इसमें मूल गणना विधि नहीं है, केवल "सभी आइटम प्राप्त करें"। शायद एक दस्तावेज़ डीबी तालिका या अपेक्षाकृत अधिक महंगा एसक्यूएल तालिका। –

+0

या, चूंकि ब्लॉब्स और टेबल इकाइयों में समवर्ती मुद्दों का पता लगाने के लिए ईटैग हैं, इसलिए आपके पास फ़ाइल नामों की गणना या सूची के साथ 1 ब्लॉब/इकाई हो सकती है। –

1

उदाहरण PHP PHP और getNextMarker का उपयोग कर उदाहरण।

एक Azure कंटेनर में कुल संख्या में ब्लॉब्स की गणना करता है। इसमें लंबा समय लगता है: 100000 ब्लब्स के लिए लगभग 30 सेकंड।

(मान लिया गया है तो हमें एक वैध $ connectionstring और एक $ container_name है) Azure संग्रहण की अजगर एपीआई साथ

$blobRestProxy = ServicesBuilder::getInstance()->createBlobService($connectionString); 
$opts = new ListBlobsOptions(); 
$nblobs = 0; 

while($cont) { 

    $blob_list = $blobRestProxy->listBlobs($container_name, $opts);  

    $nblobs += count($blob_list->getBlobs()); 

    $nextMarker = $blob_list->getNextMarker(); 

    if (!$nextMarker || strlen($nextMarker) == 0) $cont = false; 
    else $opts->setMarker($nextMarker); 
} 
echo $nblobs; 
0

यह की तरह है:

from azure.storage import * 
blob_service = BlobService(account_name='myaccount', account_key='mykey') 
blobs = blob_service.list_blobs('mycontainer') 
len(blobs) #returns the number of blob in a container 
+2

यह सही नहीं है। 'list_blobs' की 5,000 की ऊपरी सीमा है – Shane

2

आप वर्चुअल निर्देशिका का उपयोग नहीं कर रहे हैं, तो , जैसा कि पहले उत्तर दिया गया था, निम्नलिखित कार्य करेगा।

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

हालांकि, उपरोक्त कोड स्निपेट में वांछित गणना नहीं हो सकती है यदि आप वर्चुअल निर्देशिका का उपयोग कर रहे हैं।

उदाहरण के लिए, यदि आपके ब्लॉब्स निम्न के समान संग्रहीत हैं: /container/directory/filename.txt जहां ब्लॉब नाम = निर्देशिका/filename.txt कंटेनर है। लिस्टब्लॉब्स()। गणना(); केवल आपके पास कितनी "/ निर्देशिका" वर्चुअल निर्देशिका होगी। यदि आप आभासी निर्देशिकाओं में निहित ब्लब्स सूचीबद्ध करना चाहते हैं, तो आपको ListBlobs() कॉल में उपयोग FlatBlobListing = true सेट करने की आवश्यकता है।

CloudBlobContainer container = GetContainer("mycontainer"); 
var count = container.ListBlobs(null, true).Count(); 

नोट: ListBlobs() useFlatBlobListing के साथ कॉल = true आप कोड लिखने के बिना एक अधिक महंगी/धीमी गति से कॉल है ...

1

आप सिर्फ इतना पता है कि कितने धब्बे एक कंटेनर में हैं चाहते हैं Azure Storage Explorer application का उपयोग कर सकते हैं।

  1. ओपन वांछित BlobContainer enter image description here
  2. क्लिक करें फ़ोल्डर सांख्यिकी आइकन enter image description here
  3. क्रियाएँ विंडो में धब्बे की गिनती का निरीक्षण करें enter image description here