2011-05-11 3 views
7

Nous disposons actuellement d'un stockage BLOB contenant des milliers de fichiers sous le même conteneur Azure. Notre dossier convention de nommage est quelque chose comme ceci:Amélioration de la vitesse d'interrogation du stockage blob azure

NomStockage \ Equipe \ sous-équipe \ FileName

J'écris un outil qui affiche les fichiers pour chaque sous-équipe particulière. Le code obtient la liste des blobs pour le conteneur, puis pour chacun de ceux qu'il essaye de faire correspondre à la bonne Team \ Subteam (voir ci-dessous pour l'exemple de code).

Cela fonctionne mais est extrêmement lent (parce que j'ai besoin de parcourir tous les fichiers pour voir s'ils correspondent à une sous-équipe particulière). Y a-t-il un moyen d'améliorer la vitesse de la requête? Je peux penser à des optimisations telles que "Trouver le premier fichier qui correspond à l'équipe que vous recherchez et suivre quand vous trouvez une autre équipe pour quitter le début", mais cela supposerait que la BlobList est triée et ne corrige pas le pire des cas.

Malheureusement, le fractionnement des fichiers sous différents conteneurs n'est pas une option pour le moment.

est un exemple de code ici:

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

semble que listblobs sont en effet triés selon MSDN http://msdn.microsoft.com/en-us/library/dd135734.aspx. – krolth

Répondre

18

1ère solution Avec l'interface REST, vous pouvez passer

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

et cela renvoie un doc xml avec uniquement les fichiers dans la sous équipe "Dossier" (je sais que ce n'est pas un dossier mais il ressemble à un dans les outils)

Vous pourriez avoir besoin de gène évaluer une signature d'accès partagé pour pouvoir y accéder, vous devez l'indiquer à la fin de l'URL.

check out here

où il montre que vous pouvez filtrer par blobname préfixe.

2ème solution Ceci est probablement plus proche de ce que vous voulez. Si vous pouvez utiliser le nouveau client de stockage qui a été mis à jour dans azur sdk 1.3, vous pouvez maintenant utiliser

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

où Client est une instance de CloudBlobClient.

EDIT - 18 novembre 2013 il ressemble resttype n'est plus pris en charge en tant que paramètre et il devrait être restype. Cela semble s'être passé tranquillement pendant le week-end. J'ai changé l'exemple d'URL ci-dessus.

2

Avez-vous vraiment besoin de BlobListingDetails.Metadata? Cela cause beaucoup d'informations supplémentaires à télécharger. Je pense que tout ce que vous avez besoin est le nom

3

Juste une mise à jour ...

Vous pouvez utiliser obtenir une liste des blobs en utilisant GetDirectoryRefence puis blobs liste ...

var = blobContainer.GetDirectoryReference Sous-répertoire (String.Format ("{0} /", dossier)); retourne le sous-répertoire.ListBlobs (false, BlobListingDetails.Metadata);

Questions connexes