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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Память под string 
:(
    Опции темы
hug
Дата 22.5.2008, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день
Проблема такова:

Программа работает с длинными строками. Качает html переводит в строки(stream to string)-> парсит регулярками.

Замечена на предмет  утечки памяти.(за сутки сьедается 2 гига, но программа в таск менеджере постоянно ест не более 100мб)
С помощью профайлера было определено, что наиболее большие затраты памяти как раз на string.
Прочитал, что память для string выделяется в куче
gc.collect вызывается

Вопрос:Может ли проблема быть связана со string
Если да, то как ее решить? Чистить строки но как?

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


Опытный
**


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

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



скорее всего утечка вызвана незакрытыми стримами или WebResponse'ами
вызывай в конце использования в блоке finally Close() или заверни использование в using

если не поможет, посмотри, как можно оптимизировать работу с памятью
сделай, к примеру, регулярное выражение строковой константой и единственный компилируемый инстанс Regex'а (в конструктор передав RegexOptions.Compiled)

без кода сложно что-либо ещё посоветовать
PM MAIL ICQ   Вверх
hug
Дата 22.5.2008, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mihryak @ 22.5.2008,  10:07)
скорее всего утечка вызвана незакрытыми стримами или WebResponse'ами
вызывай в конце использования в блоке finally Close() или заверни использование в using

если не поможет, посмотри, как можно оптимизировать работу с памятью
сделай, к примеру, регулярное выражение строковой константой и единственный компилируемый инстанс Regex'а (в конструктор передав RegexOptions.Compiled)

без кода сложно что-либо ещё посоветовать

Большое спасибо за ответ.

стримы все закрываю
ну возможно только, что не в finally
Про регулярку спасибо. 
Но самое выражение константой наверно не получится. Возможно ли все равно использовать комплируемый инстанс?

Код


                        ArrayList Params = new ArrayList();
                        XPathNavigator xpn = xml.CreateNavigator();
                        XPathNodeIterator it = xpn.Select("//sources/source[@name='2']/information[@type='" + type.ToString() + "']/tasks/grouptask");
                        string id_group = String.Empty;
                        while (it.MoveNext()) //loop for group of task
                        {
                            url = it.Current.GetAttribute("baseurl", String.Empty);  //url for GroupTask
                            xpath = it.Current.GetAttribute("xpath", String.Empty);  //RegExp for GroupTask

                            XPathNodeIterator it1 = it.Current.Select("task/params");
                            while (it1.MoveNext()) //loop for Params for tasks
                            {
                                XPathNavigator groupidPath = it1.Current.SelectSingleNode("..");
                                id_group = groupidPath.GetAttribute("groupid", String.Empty);
                                XPathNodeIterator it2 = it1.Current.Select("param");
                                Params.Clear();
                                while (it2.MoveNext())
                                {
                                    Params.Add(it2.Current.Value.ToString());
                                }
                                string urlwithparams = null;
                                urlwithparams = url;
                                //insert params into url
                                for (int i = 0; i < Params.Count; i++)
                                {
                                    urlwithparams = urlwithparams.Replace(":par" + Convert.ToString(i + 1) + ":", Params[i].ToString());
                                }
                                try
                                {
                                    HttpWebRequest http = (HttpWebRequest)WebRequest.Create(urlwithparams);
                                    WebProxy proxy = new WebProxy();
                                    proxy.Address = new Uri(Init.GetProxy());
                                    http.Proxy = proxy;
                                    response = (HttpWebResponse)http.GetResponse();
                                }
                                catch
                                {
                                    Init.log("Error download");
                                    continue;
                                }
                                Stream receiveStream = response.GetResponseStream();
                                StringBuilder sb = new StringBuilder();

                                int Length = 1024*32;
                                Byte[] buffer = new Byte[Length];
                                int bytesRead = receiveStream.Read(buffer, 0, Length);
                                while (bytesRead > 0)
                                {
                                    sb.Append(System.Text.Encoding.UTF8.GetString(buffer, 0, bytesRead));
                                    bytesRead = receiveStream.Read(buffer, 0, Length);
                                }
                                buffer = null;
                                
                                receiveStream.Close();
                                receiveStream.Dispose();
                                response.Close();
                                //Select matches
                                Regex rx = new Regex(xpath);
                                MatchCollection matches = rx.Matches(sb.ToString());
                                responseString = null;
                                foreach (Match match in matches)
                                {
                                    files.Add(match.Groups[1].Value);
                                    group.Add(id_group);
                                }
                                rx = null;
                                matches = null;
                               
                               
                            }
                            
                        }

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


Опытный
**


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

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



в таком случае нет смысла компиллировать Regex, раз он используется только один раз

не углублялся в написанное, но
Код

                                catch
                                {
                                    Init.log("Error download");
                                    continue;
                                }

вот это может быть причиной утечки
PM MAIL ICQ   Вверх
hug
Дата 22.5.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо. понял.
переместил освобождение стримов в finally
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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