CloudBlobContainer.ListBlobs () - использование ToList () для снижения стоимости транзакции - PullRequest
3 голосов
/ 03 октября 2011

У меня есть два примера кода:

var container = new CloudBlobContainer("address");
var blobs = container.ListBlobs();
foreach (var blob in blobs)
{
    //Do somthing
}

и это:

var container = new CloudBlobContainer("address");
var blobs = container.ListBlobs().ToList();
foreach (var blob in blobs)
{
     //Do somthing
}

Даст ли второй пример какое-либо преимущество "по транзакциям"?
Сколько транзакций сделано в хранилище BLOB-объектов в каждом примере?

1 Ответ

4 голосов
/ 03 октября 2011

Редактировать : Похоже, этот вопрос относится к сообщению в блоге Мартина Ингвара Кофоеда Дженсена . Разница между этим вопросом и этим вопросом заключается в вызове .Where(...).SingleOrDefault(). Поскольку LINQ оценивается лениво, на этапе Container.ListBlobs() он все еще является IEnumerable и еще не вызвал REST API (данные не были получены). Как только происходит операция результата (например, ToList() или SingleOrDefault()), данные загружаются. Поскольку не ленивая операция вызывается в отложенном списке внутри цикла в следующем коде, она вызывает транзакцию для каждой итерации цикла:

foreach (string filePath in allFilesInStartFolder)
{
    string fileHash = GetFileHashFromCache(filePath, lastSync);

    /* Checking for added files */
    var blob = blobs.Where(b => b.LocalPath == filePath).SingleOrDefault();
    // ^^ This is a non-lazy op on a lazy evalution, so it causes a REST call.
    ....
}

Относительно вопроса в том виде, в котором он написан: оба фрагмента кода будут содержать одну транзакцию (до 5000 BLOB-объектов). Я протестировал оба фрагмента кода в LinqPad / Fiddler и вижу только один API-вызов для генерации списка BLOB-объектов (заменил наше имя хранилища на {mystore) }):

https://{mystore}.blob.core.windows.net/
    {mystore}?restype=container&comp=list&delimiter=%2F&timeout=90

Согласно документации для List Blobs REST API , до 5000 результатов может быть возвращено за один вызов. Поэтому, если вы хотите перечислить все BLOB-объекты во всем контейнере, потребуется максимум (# blobs / 5000) транзакций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...