#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. На одноядерном компьютере может быть полезно загружать один большой двоичный объект вместо загрузки нескольких больших двоичных объектов. Я где-то читал, что когда вы запускаете больше потоков, чем количество доступных ядер, процессор тратит много времени на переключение потоков, что фактически приводит к тому, что операции занимают больше времени.