C # .NET Framework 4.6.1 массовая загрузка данных - PullRequest
0 голосов
/ 16 ноября 2018

Я создаю приложение для отображения расписаний. Для этого мне нужно загрузить огромное количество данных в мой 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;
    }

но загрузка все равно идет медленно. Есть ли какой-нибудь более быстрый способ загрузки этих данных или есть какая-то структура, которая могла бы помочь мне достичь этого?

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