Как наиболее эффективно выкачать несколько миллионов html страниц, при этом не потратив вечность?
Программа на C# делает Get запросы и выкачивает код. Я создаю в цикле по новому потоку, каждый поток с функцией выкачивания html. После 1400 повторов цикла прога виснет, visual studio тоже. Иногда отвисает и выбрасывает ошибку out of memory. Кажется, это из за большого количества потоков.
Вопрос: как мне наиболее эффективно выкачать несколько миллионов html страниц, при этом не потратив вечность?
Если по out of memory то просто проблемы с очисткой памяти повставляй в конце каждого цикла закачки 1 страницы GC.Collect() и скорее всего проблема исчезнет. Большое количество потоков не поможет, 10 - 15 максимум одновременно, больше есть шанс что начнут падать екзепшены в каком либо потоке и обработка каждого будет занимать много времени.
У вас что 1400 потоков создается? Если у вас оперативки гигов 8-16 то конечно не хватит памяти... Вы хоть память освобождаете?
Вам нужно написать менеджер очереди. Несколько потоков будут висеть постоянно и каждый будет обращаться за новым заданием к менеджеру (придется блокировать остальные потоки дабы небыло гонки за ресурсами). Получив задание ваш поток-воркер выкачает данные и сохранит результат работы в базу/файловую систему и будет просить новое задание...
Я не программирую на C#, поэтому могу сказать только по подходу к задаче. На каждую страницу по потоку - расточительство. Тем более, что на каждом углу говорят о том, как удобно сделана асинхронность в C#. Т.е. потоки не нужны вообще, скачивать надо асинхронно и единственный поток вполне справится со скачиванием данных на достаточно широком канале.