Intenté contar blobs utilizando ListBlobs() y para un contenedor con aproximadamente 400,000 artículos, me llevó más de 5 minutos.
Si tiene control total sobre el contenedor (es decir, controla cuándo se producen las escrituras), podría almacenar en caché la información de tamaño en los metadatos del contenedor y actualizarla cada vez que se elimine o inserte un elemento. Aquí es una pieza de código que devolvería el recuento de burbuja envase:
static int CountBlobs(string storageAccount, string containerId)
{
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(storageAccount);
CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient();
CloudBlobContainer cloudBlobContainer = blobClient.GetContainerReference(containerId);
cloudBlobContainer.FetchAttributes();
string count = cloudBlobContainer.Metadata["ItemCount"];
string countUpdateTime = cloudBlobContainer.Metadata["CountUpdateTime"];
bool recountNeeded = false;
if (String.IsNullOrEmpty(count) || String.IsNullOrEmpty(countUpdateTime))
{
recountNeeded = true;
}
else
{
DateTime dateTime = new DateTime(long.Parse(countUpdateTime));
// Are we close to the last modified time?
if (Math.Abs(dateTime.Subtract(cloudBlobContainer.Properties.LastModifiedUtc).TotalSeconds) > 5) {
recountNeeded = true;
}
}
int blobCount;
if (recountNeeded)
{
blobCount = 0;
BlobRequestOptions options = new BlobRequestOptions();
options.BlobListingDetails = BlobListingDetails.Metadata;
foreach (IListBlobItem item in cloudBlobContainer.ListBlobs(options))
{
blobCount++;
}
cloudBlobContainer.Metadata.Set("ItemCount", blobCount.ToString());
cloudBlobContainer.Metadata.Set("CountUpdateTime", DateTime.Now.Ticks.ToString());
cloudBlobContainer.SetMetadata();
}
else
{
blobCount = int.Parse(count);
}
return blobCount;
}
Esto, por supuesto, asume que actualice ItemCount/CountUpdateTime cada vez que se modifica el contenedor. CountUpdateTime es una protección heurística (si el contenedor se modificó sin que alguien actualice CountUpdateTime, se forzará un recuento) pero no es confiable.
Estoy bastante seguro de ListBlobs seguirán automáticamente los tokens de continuación. (Así que no creo que deba hacer nada explícito con NextMarker para que esto funcione). – smarx
¡Vaya! Estoy gastando demasiado tiempo en el nivel de API, parece ... :) –