2011-05-11 15 views
7

वर्तमान में हमारे पास एक ही Azure कंटेनर के तहत हजारों फाइलों के साथ ब्लॉब स्टोरेज है।एज़ूर ब्लोब स्टोरेज क्वेरीिंग गति में सुधार

StorageName \ टीम \ SubTeam \ FileName

मैं एक उपकरण है जो प्रत्येक विशेष subteam के लिए फ़ाइलों को प्रदर्शित करता है लिख रहा हूँ: हमारे फ़ाइल नामकरण सम्मेलन कुछ इस तरह है। कोड कंटेनर के लिए ब्लॉब्स की सूची प्राप्त करता है और फिर उनमें से प्रत्येक के लिए यह सही टीम \ Subteam से मिलान करने का प्रयास करता है (नमूना कोड के लिए नीचे देखें)।

यह काम करता है लेकिन यह बेहद धीमा है (क्योंकि मुझे यह देखने के लिए सभी फ़ाइलों के माध्यम से जाना होगा कि वे किसी विशेष उपमहाक से मेल खाते हैं)। क्या क्वेरी की गति में सुधार करने का कोई तरीका है? मैं ऑप्टिमाइज़ेशन के बारे में सोच सकता हूं जैसे कि "जिस टीम को आप ढूंढ रहे हैं उससे मेल खाने वाली पहली फ़ाइल ढूंढें और फिर जब आप जल्दी से बाहर निकलने के लिए एक अलग टीम ढूंढें तो ट्रैक रखें" लेकिन यह मान लेगा कि ब्लॉबलिस्ट को सॉर्ट किया गया है और ठीक नहीं होगा सबसे खराब स्थिति परिदृश्य।

दुर्भाग्यवश विभिन्न कंटेनर के तहत फ़ाइलों को विभाजित करना इस समय एक विकल्प नहीं है।

यहाँ नमूना कोड है:

IEnumerable<IListBlobItem> blobs = blobContainer.ListBlobs(
    new BlobRequestOptions() 
    { 
     UseFlatBlobListing = true, 
     BlobListingDetails = BlobListingDetails.Metadata 
    }).OfType<CloudBlob>(); 

foreach (var blob in blobs) { 
var cloudy = blob as CloudBlob; 

string blobTeamId = cloudy.Uri.Segments[2].Trim('/'); 
if (blobTeamId != teamId) 
     continue; 

//Do something interesting with the file 
+0

ऐसा लगता है कि listblobs वास्तव में एमएसडीएन http://msdn.microsoft.com/en-us/library/dd135734.aspx के अनुसार क्रमबद्ध हैं। – krolth

उत्तर

18

1 समाधान REST इंटरफ़ेस के साथ आप

http://somwhere.com/mycontainername/?restype=container&comp=list&delimiter=/&prefix=\Team\SubTeam 

में पारित कर सकते हैं और इस उप में केवल फाइलों के साथ एक xml दस्तावेज़ वापस आ जाएगी टीम "फ़ोल्डर" (मुझे पता है कि यह एक फ़ोल्डर नहीं है लेकिन यह उपकरण में से एक जैसा दिखता है)

आपको जीन की आवश्यकता हो सकती है इसे एक्सेस करने में सक्षम होने के लिए साझा पहुंच हस्ताक्षर को रेट करें, आपको इसे URL के अंत में टैग करना होगा।

check out here

यह कहाँ से पता चलता है कि आप blobname उपसर्ग के आधार पर फ़िल्टर कर सकते हैं।

दूसरा समाधान यह संभवतः आप जो चाहते हैं उसके करीब है। यदि आप नए स्टोरेज क्लाइंट का उपयोग कर सकते हैं जिसे एज़ूर एसडीके 1.3 में अपडेट किया गया था तो अब आप

IEnumerable blobList = client.ListBlobsWithPrefix ("टीम/सबटेम") का उपयोग कर सकते हैं;

जहां क्लाइंट क्लाउडब्लोब क्लाइंट का उदाहरण है।

संपादित करें - 18 नवम्बर 2013 यह resttype तरह लग रहा है अब एक पैरामीटर के रूप में समर्थन किया है और यह restype होना चाहिए। ऐसा लगता है कि यह सप्ताहांत में चुपचाप हुआ है। मैंने ऊपर यूआरएल उदाहरण बदल दिया है।

2

क्या आपको वास्तव में BlobListingDetails.Metadata की आवश्यकता है? जिससे बहुत सारी अतिरिक्त जानकारी डाउनलोड की जा रही है। मुझे लगता है कि आप सभी की जरूरत नाम

3

बस एक अद्यतन ...

आप GetDirectoryRefence और फिर सूची धब्बे का उपयोग करके धब्बे की एक सूची प्राप्त उपयोग कर सकते हैं ...

वर उपनिर्देशिका = blobContainer.GetDirectoryReference है (स्ट्रिंग.फॉर्मैट ("{0} /", फ़ोल्डर)); वापसी उपनिर्देशिका।ListBlobs (झूठी, BlobListingDetails.Metadata);

संबंधित मुद्दे