2011-05-11 15 views
7

Şu anda aynı Azure kabı altında binlerce dosya içeren bir blob deposu var. Ben her bir subteam için dosyaları görüntüleyen bir araç yazıyorumAzure blob depolama sorgulama hızını artırma

StorageName \ Ekibi \ SubTeam \ FileName: Bizim dosya adlandırma kuralı böyle bir şeydir. Kod, Kapsayıcı için blobların listesini alır ve daha sonra her biri için doğru Team \ Subteam ile eşleşmeye çalışır (örnek kod için aşağıya bakın).

Bu, ancak oldukça yavaş çalışır (çünkü belirli bir alt çizgi ile eşleşip eşleşmediklerini görmek için tüm dosyaları gözden geçirmem gerekir). Sorunun hızını artırmanın bir yolu var mı? "Aradığın takımla eşleşen ilk dosyayı bul ve sonra erken çıkmak için farklı bir takım bulduğunda takip et" gibi optimizasyonları düşünebilirim ama bu BlobList'in sıralandığını ve düzeltilemeyeceğini varsayar. en kötü durum senaryosu.

Henüz farklı kapların altındaki dosyaları bölme şu anda bir seçenek değil. Eğer

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

içinde geçebilir ve bu alt sadece dosyaları ile bir xml doc dönecektir DİNLENME arayüzüyle

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 gerçekten MSDN http://msdn.microsoft.com/en-us/library/dd135734.aspx göre sıralanmış gibi görünüyor. – krolth

cevap

18

1 Çözüm : Burada

örnek kod "Klasör" ekibi (Onun bir klasör olmadığını biliyorum ama araçlarda bir tane gibi görünüyor)

Giden gerekebilir Erişebilmek için paylaşımlı erişim imzasını derecelendirirseniz, URL'nin sonunda bunu etiketlemeniz gerekir.

check out here

Eğer blobname öneki göre filtreleme yapabilirsiniz göstermektedir yere.

2. ÇÖZÜM Bu, muhtemelen istediğiniz şeylere daha yakındır. Eğer azure sdk 1.3'te güncellenen yeni depolama istemcisini kullanabilirsiniz, şimdi

IEnumerable blobList = client.ListBlobsWithPrefix ("Team/SubTeam");

İstemci, bir CloudBlobClient örneğidir.

DÜZENLEME - 18 Kasım 2013 Bu, artık parametresinin artık bir parametre olarak desteklenmediğini ve bu dosyanın restype türünde olması gerektiğini gösteriyor. Bu hafta sonu sessizce gerçekleşmiş gibi görünüyor. Yukarıdaki url örneğini değiştirdim.

2

Gerçekten BlobListingDetails.Metadata'ya ihtiyacınız var mı? Bu, çok fazla bilginin indirilmesine neden oluyor. Ben size gerekli olan tüm isim Hemen bir güncelleme

3

...

Sen GetDirectoryRefence ve ardından liste lekeler kullanarak lekeler listesini almak kullanabilirsiniz

...

var alt dizini = blobContainer.GetDirectoryReference olduğunu düşünüyorum (String.Format ("{0} /", klasör)); altDirectory değerini döndür.ListBlobs (false, BlobListingDetails.Metadata);