8
votes

Améliorer la vitesse de requête de stockage de blob d'azur

Nous avons actuellement un stockage BLOB avec des milliers de fichiers sous le même conteneur d'azur. Notre convention de nommage de fichier est quelque chose comme ceci:

StorageName \ Team \ Subteam \ Nom de fichier P>

J'écris un outil qui affiche les fichiers pour chaque sous-quai particulier. Le code obtient la liste des blobs pour le conteneur, puis pour chacun de ceux qu'il essaie de correspondre à la bonne équipe \ Subteam (voir ci-dessous pour le code exemple). P>

Cela fonctionne mais est extrêmement lent (car je dois passer à travers tous les fichiers pour voir s'ils correspondent à un sous-jardin particulier). Y a-t-il un moyen d'améliorer la vitesse de la requête? Je peux penser à des optimisations telles que "Rechercher le premier fichier qui correspond à l'équipe que vous recherchez, puis gardez une piste lorsque vous trouverez une équipe différente de cesser de fumer" mais cela supposerait que le blobliste est trié et ne corrigerait pas le pire scénario. p>

Malheureusement, la division des fichiers sous différents conteneurs n'est pas une option à l'heure actuelle. P>

Voici un exemple de code: P>

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


1 commentaires

On dirait que des ListBlobs sont effectivement triés selon MSDN msdn.microsoft.com/en-us /Library/dd135734.aspx .


3 Réponses :


18
votes

1ère solution Avec l'interface de repos, vous pouvez passer dans xxx

et cela renvoie un document XML avec uniquement les fichiers du «dossier» de la sous-équipe (je sais que ce n'est pas un dossier, mais cela ressemble à un Les outils)

Vous devrez peut-être générer une signature d'accès partagée pour pouvoir y accéder, vous devez étiqueter cela à la fin de l'URL.

Découvrez ici

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

2e solution Ceci est probablement plus proche de ce que vous voulez. Si vous pouvez utiliser le nouveau client de stockage mis à jour dans l'AZURE SDK 1.3, vous pouvez maintenant utiliser

Ienumerable Bloblist = Client.ListBlobSwithPrefix ("Team / Subteam"); ​​

Où Le client est une instance de Cloudblobclient.

EDIT - 18 nov. 2013 Il semble que le repostype n'est plus pris en charge comme un paramètre et il devrait être restaype. Cela semble s'être passé tranquillement au cours du week-end. J'ai changé l'exemple d'URL ci-dessus.


0 commentaires

2
votes

Avez-vous vraiment besoin de bloblistingDétails.métadata? Cela provoque une téléchargement de nombreuses informations supplémentaires. Je pense que tout ce dont vous avez besoin est le nom


0 commentaires

3
votes

juste une mise à jour ...

Vous pouvez utiliser obtenir une liste de blobs à l'aide de getdirectoryrefence, puis liste blobs ... xxx


0 commentaires