Я создаю приложение для отображения расписаний. Для этого мне нужно загрузить огромное количество данных в мой API. На начало месяца загружается около 6000 файлов JSON (примерно 190 линий шины и каждая строка имеет URL-адреса для каждого дня месяца), и количество скачиваемых JSON уменьшается ежедневно (во второй день это будет ~ 5800 JSON, в третий день ~ 5600 и т. д.) из моего местного API общественного транспорта. Каждый JSON имеет около 3 МБ и с 6000 URL-адресов в начале каждого месяца, это около 17 ГБ данных. При этом мне стало интересно, есть ли более быстрый способ сделать это.
В начале я пытался использовать эту функцию:
public async static Task<List<string>> MassDataDownload(List<string> urlList)
{
List<string> listOfJsons = new List<string>();
using (HttpClient client = new HttpClient())
{
foreach(var url in urlList)
{
HttpResponseMessage response = await client.GetAsync(url);
var json = string.Empty;
if (response.IsSuccessStatusCode)
json = await response.Content.ReadAsStringAsync();
else
continue;
listOfJsons.Add(json);
}
}
return listOfJsons;
}
но для загрузки даже 1/10 ссылок потребовалось почти 10 минут. Затем я наткнулся на эту страницу массовой загрузки данных , и моя ошибка заключалась в том, чтобы использовать один HttpClient для загрузки, и я пытался зайти на один сайт много раз за короткое время. Основываясь на информации, я создал эту функцию:
public async static Task<List<string>> MassDataDownload(List<string> urlList)
{
BlockingCollection<HttpClient> ClientQueue = new BlockingCollection<HttpClient>();
urlList.ForEach(x => ClientQueue.Add(new HttpClient()));
List<string> listOfJsons = new List<string>();
foreach (var url in urlList)
{
var worker = ClientQueue.Take();
var json = await worker.GetStringAsync(url);
worker.Dispose();
listOfJsons.Add(json);
}
return listOfJsons;
}
но загрузка все равно идет медленно. Есть ли какой-нибудь более быстрый способ загрузки этих данных или есть какая-то структура, которая могла бы помочь мне достичь этого?