Самый быстрый способ параллельного чтения больших двоичных объектов Azure

#c# #azure #asynchronous #azure-storage #azure-blob-storage

#c# #azure #асинхронный #azure-хранилище #azure-blob-хранилище

Вопрос:

Я пытаюсь загрузить файлы больших двоичных объектов из Azure, используя приведенный ниже код

Способ загрузки :

 private static async Task<string> GetPriceString(int seriesId) {
    var maxRetries = 15;
    var storage = CloudStorageAccount.Parse("Storage Account Connection String");
    var blob = storage.CreateCloudBlobClient().GetContainerReference("Container Name")
        .GetBlockBlobReference($"{seriesId}.csv");

    var priceString = await Policy.Handle<Exception>()
        .WaitAndRetryAsync(maxRetries, attempt => TimeSpan.FromSeconds(attempt * 0.5))
        .ExecuteAsync(async () => await blob.DownloadTextAsync());
    return priceString;
}
  

Вызывающий код :

 int[] seriesIds = { 10, 100 };
List<Task<string>> tasks = new List<Task<string>>();
foreach(var seriesId in seriesIds) {
    tasks.Add(GetPriceString(seriesId));
}

await Task.WhenAll(tasks);
  

Это работает, но проблема в том, что для чтения 100 больших двоичных объектов требуется около 30 секунд (размер каждого файла около 200 КБ). Учитывая размер файлов, скорость чтения очень низкая.

Есть ли какая-либо лучшая альтернатива параллельной загрузке файлов, например, какой-нибудь собственный код Azure вместо того, чтобы вручную вызывать его параллельно?

Комментарии:

1. Пара вещей, которые нужно попробовать. 1. Нет необходимости каждый раз получать ссылку на контейнер. Отделите это и предоставьте его каждому вызову GetPriceString вместо этого. 2. Вы используете Polly и обрабатываете все исключения. Попробуйте удалить это, чтобы увидеть, действительно ли вы сталкиваетесь с исключениями, которые затем запускают повторные попытки.

2. @JohnH 1. Я попробую удалить его. 2. Я могу заверить вас, что исключений нет.

3. Я не думаю, что получение ссылки на контейнер в каждом цикле замедляет работу. Можете ли вы сказать, сколько ядер доступно для вас на компьютере, на котором выполняется этот код?

4. Код @GauravMantri выполняется на компьютере P1V2 (1 ядро) в одном экземпляре.

5. На одноядерном компьютере может быть полезно загружать один большой двоичный объект вместо загрузки нескольких больших двоичных объектов. Я где-то читал, что когда вы запускаете больше потоков, чем количество доступных ядер, процессор тратит много времени на переключение потоков, что фактически приводит к тому, что операции занимают больше времени.