Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > ASP.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2013, 14:46   #1
kobyb
Новичок
Джуниор
 
Регистрация: 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 гигабайтах и памяти просто реально не хватает, то как можно по другому оптимизировать весь этот процесс? Если я буду пробегать по каталогам обычным циклом и создавать для каждого каталога свой новый процесс, это может мне помочь, или дело вообше не в этом?
kobyb вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить координаты точки а(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