Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Менеджмент и Освобождение Памяти, Как оптимизировать ? 
:(
    Опции темы
bytex2
Дата 26.5.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.5.2006

Репутация: нет
Всего: нет



Всем привет,

Написал многопоточную парсилку HTML страниц.

При запуске, размер памяти занимаемой программой растет очень быстро, несмотря на то что я ничего специально в памяти не храню.

С чем это может быть связанно ?

Глядя на график память/время, видно что память иногда освобождается, но тут же занимается еще больше, ну и своп растет сильно.
Иногда прога начинает занимать до 600Мб в памяти, и еще не меньше в Swap.

Как это лечится ?  smile 

 
PM MAIL   Вверх
Дрон
Дата 26.5.2006, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Фигасе...

А вообще мы тут не телепаты smile
Скорее всего что-то не так в самой программе. Например, ты случаем разных нехороших операций с большими (> 1000 символов) строками не делаешь?

Для начала же попробуй через некоторые промежутки времени вызывать GC.Collect(); -- вдруг поможет smile 


--------------------
Да. Именно так.
PM   Вверх
Exception
Дата 26.5.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Если делаешь много операций со строками, используй класс StringBuilder. 
PM   Вверх
bytex2
Дата 26.5.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.5.2006

Репутация: нет
Всего: нет



Дрон

Извиняюсь за невнятный вопрос smile Дело в том что я написал в начале свое творение на Delphi, но потом решил
попробовать реализовать его на C# так как в C# есть автоматическая сборка мусора.

Как часто надо использовать GC.Collect() ?

Ниже привожу основную часть своей программы, от которой зависит прирост памяти.
Замечено что при меньших объемах скачиваемой информации, рост памяти происходит медленнее.

Не мог бы ты подсказать что тут можно оптимизировать ? Заранее спасибо smile

Код

            public IHTMLDocument2 getHtmlPage(String url)
            {
                ServicePointManager.DefaultConnectionLimit = 20;
                IWebRequestCreate webRequestCreate = new CompressibleHttpRequestCreator();
                CompressibleHttpWebRequest Req = (CompressibleHttpWebRequest)webRequestCreate.Create(new Uri(url));
                Req.AcceptEncodings = AcceptEncodings.GZip;
                Req.Timeout=timeout * 1000;
                CompressibleHttpWebResponse Resp = (CompressibleHttpWebResponse)Req.GetResponse();
                StreamReader Reader = new StreamReader(Resp.GetResponseStream());
                string Body = Reader.ReadToEnd();

                ActivityFlag = true;
                Resp.Close();

                mshtml.HTMLDocument Doc1 = new mshtml.HTMLDocument();
                IHTMLDocument2 Doc2 = (IHTMLDocument2)Doc1;
                Doc2.write(Body);
                Doc2.close();

                return Doc2;
            }


Добавлено @ 15:53 
Exception

В том то все и дело что я не делаю массовых операций со строками.
Все что я делаю, это скачиваю страницу, анализирую ее на предмет присутствия там своих меток,
кладу урл в ArrayList и скачиваю новую страницу.  

Это сообщение отредактировал(а) bytex2 - 26.5.2006, 15:55
PM MAIL   Вверх
Exception
Дата 26.5.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 4525
Регистрация: 26.12.2004

Репутация: 29
Всего: 186



Модератор: используйте кнопку "Код"! 
PM   Вверх
Дрон
Дата 26.5.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(bytex2 @  26.5.2006,  16:51 Найти цитируемый пост)
Как часто надо использовать GC.Collect() ?

Не слишком часто. Более конкретных рекомендаций нет. Надо самому экспериментировать.

Есть предположение, что mshtml.HTMLDocument(); съедает много памяти. Но я с ним не работал -- ничего сказать не могу. Для начала проверь, есть ли у него метод Dispose() и если есть то вызывай его, когда он тебе становится не нужен. Кстати, то же самое и для других объектов (Req, Reader и т.д.).  

Это сообщение отредактировал(а) Дрон - 26.5.2006, 16:21


--------------------
Да. Именно так.
PM   Вверх
bytex2
Дата 26.5.2006, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.5.2006

Репутация: нет
Всего: нет



Дрон

А может помочь если в конце String Body = null делать ?
 
PM MAIL   Вверх
Дрон
Дата 26.5.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 93



Цитата(bytex2 @  26.5.2006,  18:09 Найти цитируемый пост)
А может помочь если в конце String Body = null делать ?

Нет. Она и так при выходе из метода за пределы видимости уходит. 


--------------------
Да. Именно так.
PM   Вверх
ivashkanet
Дата 26.5.2006, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Цитата(Дрон @  26.5.2006,  16:21 Найти цитируемый пост)
Dispose()

Вместо вызова Dispose() лучше поьзоваться конструкцией using
Код

using (mshtml.HTMLDocument Doc1 = new mshtml.HTMLDocument())
{
}

Она сама, по ее завершению, уничтожит объект Doc1, вызвав его метод finalize(). 
Аналогично с остальными  smile 
P.S. По поводу GC (Garbige Collector) он работает с особенностями: все объекты пережившие две! (по умолчанию) сборки мусора не удалятся никогда  smile 
Можно вручную изменить этот параметр: GC.MaxGeneration
Плюс к этому если у класса есть деструктор, то при первой сборке мусора он вызывается, но объект уничтожается только после следующей сборки. Почти 100% кандидат в "бессмертные"  smile 
P.P.S. Где то здесь Void постил ссылку на инфу по этому поводу. ИМХО в теме "Мои ламерские вопросы по C#" тов. Сарт-а  smile 
P.P.P.S 
Цитата(bytex2 @  26.5.2006,  15:51 Найти цитируемый пост)
анализирую ее на предмет присутствия там своих меток

А где ты это делаешь? В 
Цитата(bytex2 @  26.5.2006,  15:51 Найти цитируемый пост)
IHTMLDocument2 Doc2 = (IHTMLDocument2)Doc1;
 или 
Цитата(bytex2 @  26.5.2006,  15:51 Найти цитируемый пост)
Doc2.write(Body);
 Больше я подозрительных строчек не нашел  smile 
 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0827 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.