|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
20.03.2013, 14:46 | #1 |
Новичок
Джуниор
Регистрация: 20.03.2013
Сообщений: 1
|
WebRequest в паралельном коде, меняющий прокси
0
Здравствуйте, у меня такая проблема: Моё консольное приложение парсит онлайн магазин с большим количеством товаров. Структура парсинга такова: 1)Используя Parallel.For я пробегаю по всем каталогам. 2)В каждом каталоге используя Parallel.For я пробегаю по всем подкаталогам и так рекурсией, пока не дойду до каталога нижнего уровня с товарами. 3)Узнаю количество страниц с товарами в данном каталоге и используя Parallel.For пробегаю по всем страницам , заходя на информацию о каждом продукте. В каждом каталоге около 30000 товаров. Проблема в следующем,информация о каталогах сохраняется быстро, но как дело доходит до продуктов, начинаются проблемы. В логе только и вижу Exception of type 'System.OutOfMemoryException' was thrown. Все запросы у меня делаются из одной функции public static string GetDataFromUrl(string url, ConcurrentDictionary<string, int> proxy) { string data = ""; WebRequest request = null; try { request = WebRequest.Create(url); request.Proxy = new WebProxy(proxy.Keys.ElementAt(0), proxy.Values.ElementAt(0)); request.PreAuthenticate = true; request.Credentials = new NetworkCredential("kobyb", "nbzbnbzb"); request.Proxy.Credentials = new NetworkCredential("kobyb", "nbzbnbzb"); request.Timeout = 120000; ((HttpWebRequest) request).KeepAlive = false; ((HttpWebRequest) request).ReadWriteTimeout = 120000*2; ServicePointManager.DefaultConnecti onLimit = 200; if (request != null) { using (var response = request.GetResponse()) { using (var stream = response.GetResponseStream()) using (var reader = new StreamReader(stream)) { data = reader.ReadToEnd(); if (string.IsNullOrEmpty(data)) return GetDataFromUrl(url, ProxyWorker.NextProxy); } response.Close(); } } } catch (Exception exception) { return GetDataFromUrl(url, ProxyWorker.NextProxy); } return data; } Так же в App.config поставил <system.net> <connectionManagement> <add address="www.contoso.com" maxconnection="200" /> <add address="*" maxconnection="200" /> </connectionManagement> </system.net> <runtime> <gcServer enabled="true"/> </runtime> В catch ловятся постоянно ошибки вида Time Out. В результате база поначалу заполняется быстро, потом скорость заполнения резко снижается , вываливается ошибка Exception of type 'System.OutOfMemoryException' was thrown. {Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation.} Помогите пожалуйста, что мне сделать ?Без паралельности программа работает, но будет выполняться несколько месяцев.Что я делаю не правильно? Если всё дело в 2 гигабайтах и памяти просто реально не хватает, то как можно по другому оптимизировать весь этот процесс? Если я буду пробегать по каталогам обычным циклом и создавать для каждого каталога свой новый процесс, это может мне помочь, или дело вообше не в этом? |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вычислить координаты точки а(x,y) при повороте системы координат на угол альфа и паралельном переносе на вектор a=(u,v). | pitovit | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 26.10.2012 21:13 |
Прокси | kilogram | Свободное общение | 3 | 05.07.2012 00:51 |
Макрос меняющий местами строки | uncleau | Microsoft Office Excel | 5 | 16.06.2010 18:17 |
Прокси | FROSTMORN | Безопасность, Шифрование | 2 | 20.11.2008 15:17 |
Прокси | russian-stalker | Общие вопросы Delphi | 1 | 07.09.2008 19:36 |