Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Эфективность использования Интернет


Автор: infarch 25.4.2013, 11:18
Я работаю над приложением типа веб-краулер. Задача - быстро скачать много страниц. И вот я заметил что приложение качает Х страниц с примерно с одинаковой скоростью, вне зависимости от того сколько экземпляров запущено. Я написал тестовую программу:
Код

    class Program
    {
        static string[] MakeLinks()
        {
            List<string> list = new List<string>();
            string url = "http://apache.org?x=" + DateTime.Now.Ticks; // так боремся с кешированием
            for (int i = 0; i < 500; i++)
            {
                list.Add(url + "&y=" + i);  // так боремся с кешированием
            }
            return list.ToArray();
        }

        static void B()
        {
            int c = 0;
            Stopwatch sw = new Stopwatch();
            var links = MakeLinks();
            List<Task<string>> tasks = new List<Task<string>>();
            sw.Start();
            foreach (string url in links)
            {
                Console.WriteLine(url);
                WebClient client = new WebClient();
                tasks.Add(client.DownloadStringTaskAsync(url));
            }
            foreach (var t in tasks)
            {
                t.Wait();
                c += t.Result.Length;
            }
            sw.Stop();
            Console.WriteLine("Downoaded {0} bytes. Download time: {1}", c, sw.Elapsed);

        }

        static void Main(string[] args)
        {
            B();
        }
    }


Запустил один экземпляр, время работы от 55-60 сек. Запустил 3 экземпляры, время работы 55-65 сек. Шесть экземпляров - 70 секунд примерно. Тобишь, время скачивания мало зависит от колличества экземпляров приложения. Пожалуй можно было и еще запускать.

А это мне не очень подходит. Я предпочел бы чтоб один запущенный экземпляр употребил весь доступный интернет и выполнил работу за 5 секунд :( Вот, прошу совета... Что тут не так, как полностью нагрузить сеть из одного экземпляра приложения?

Автор: Machaon 25.4.2013, 14:59
Если веб сервер настроен на определенное количество запросов страниц в заданный промежуток времени то никак запускай хоть 100 экземпляров прирост будет минимальным.

Автор: infarch 25.4.2013, 16:16
Это я понимаю. Но вы не внимательно прочитали - 6 экземпляров приложения, запущенных одновременно, отработали за почти то же самое время что и один экземпляр. Сервер отдал все без напряжения, ни одной ошибки небыло. Отсюда я делаю вывод что есть некий лимит на сетевые запросы для одного процесса. Иных вариантов в голову не приходит, увы (

Автор: Machaon 25.4.2013, 18:12
Один поток качает единовременно один файл.
чтобы загрузить весь канал получаш все ссылки которые тебе нужно скачать для каждый ссылки создаешь к примеру Экземпляр WebClient и запускаешь скачку всех ссылок одновременно но жать ресурсы будет мама негорюй.

Автор: infarch 26.4.2013, 10:13
Вы бы в код глянули, что ли... Там именно так и сделано.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)