2011-05-11 11 views
7

Actualmente tenemos un almacenamiento blob con miles de archivos en el mismo contenedor de Azure. Nuestra convención de nomenclatura de archivos es algo como esto:Mejorando la velocidad de consulta de almacenamiento de blobs azules

StorageName \ equipo \ Subequipos \ Nombre de archivo

estoy escribiendo una herramienta que muestra los archivos de cada sub-equipo en particular. El código obtiene la lista de blobs para el contenedor y luego para cada uno de los que trata de hacer coincidir con el Team \ Subteam correcto (ver abajo el código de muestra).

Esto funciona pero es extremadamente lento (porque necesito revisar todos los archivos para ver si coinciden con un subteam particular). ¿Hay alguna manera de mejorar la velocidad de la consulta? Puedo pensar en optimizaciones como "Encuentre el primer archivo que coincida con el equipo que está buscando y luego realice un seguimiento cuando encuentre un equipo diferente para salir temprano", pero eso supondría que BlobList está ordenado y no arreglaría el peor de los casos.

Desafortunadamente, dividir los archivos en diferentes contenedores no es una opción en este momento.

Aquí es código de ejemplo:

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

parece que las listas se ordenan de acuerdo con MSDN http://msdn.microsoft.com/en-us/library/dd135734.aspx. – krolth

Respuesta

18

primera solución Con la interfaz REST que puede pasar en

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

y esto va a devolver un documento XML con sólo los archivos de la sub equipo "Carpeta" (sé que no es una carpeta pero se ve como una en las herramientas)

Es posible que tengas que generar calificar una firma de acceso compartido para poder acceder a ella, debe etiquetar esto al final de la URL.

check out here

donde se demuestra que se puede filtrar por blobname prefijo.

2nd Solution Esto es probablemente más cercano a lo que desea. Si puede usar el nuevo cliente de almacenamiento que se actualizó en el azure sdk 1.3, ahora puede usar

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

Donde el Cliente es una instancia de CloudBlobClient.

EDITAR - 18 de noviembre de 2013 parece que resttype ya no es compatible como parámetro y debe ser restype. Esto parece haber sucedido tranquilamente durante el fin de semana. He cambiado el ejemplo de la url anterior.

2

¿Realmente necesita BlobListingDetails.Metadata? eso está causando que se descargue mucha información adicional. Creo que todo lo que necesita es el nombre

3

Apenas una actualización ...

Se puede utilizar una lista de manchas utilizando GetDirectoryRefence y luego lista manchas ...

var = subdirectorio blobContainer.GetDirectoryReference (String.Format ("{0} /", carpeta)); return subDirectory.ListBlobs (falso, BlobListingDetails.Metadata);

Cuestiones relacionadas