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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2011, 17:18   #1
vebster35
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 11
По умолчанию IdHTTP - проблема с Get запросом через некоторое кол-во скаченых мегабайт

Суть проблемы:
- посылается Get запрос на некоторый сайт: strmn:= IdHTTP1.Get('http://site.com/index.php');.
- В strmn заносится страница сайта, которая в последствии анализируется.
- После анализа, вновь посылается тоже самый запрос и так бесконечное кол-во раз: IdHTTP1.Get -> Анализ -> IdHTTP1.Get -->

Через время, а вернее скачивания программой, посредствам Get запроса на одну и туже страницу, определенного количества мегабайт (в частности у меня начинается проблема после 180мб, смотрю по стате в оутпосте) происходит странная вещь.
Как будто б в этом месте программы становится break - прерывается работа текущей процедуры (в частности нажатие на кнопку), т.е. не передается выполнение следующей строке после запроса.
Ставлю бряк на строку кода с запросом, дойдя до него программа начинает его выполнять и уходит в дебри подключенных модулей но не выходит из него)

Может кто сталкивался с подобной проблемой и знает как преодолеть сей интересный феномен? т.к. складывается впечатление что происходит либо переполнение какойто переменной, и процедера уходит в даун, либо затор и дальнейшее выполнение прерывается
vebster35 вне форума Ответить с цитированием
Старый 30.03.2011, 21:06   #2
Mifody
Форумчанин
 
Регистрация: 12.02.2009
Сообщений: 215
По умолчанию

эээ, 180 Мб это что? размер страницы
хотя подозреваю, что просто суммарный объем данных.
если последнее, скорее всего утечка памяти "шалит", тогда:
1. посмотреть как Ваша программа "жрет" память через диспетчер задач, если идет постоянный прирост памяти, то:
2. искать утечку памяти в своем коде (хотя утечка может быть и в коде компонент), если глазками не получается, то:
3. поставить менеджер утечки памяти (или как он там называется правильно). У Вас не понятно какая версия делфей, у меня Delphi 7 и использую MemProof. Вещь древняя, но найти можно и ловит утечки на ура.

З.Ы. По своему опыту скажу, парсил сайты по 100 000 страниц, память жралась до 10 Мб маскиум , и то, потому, что накапливал большие объемы в переменных перед сбросом в базу
Помог с вопросом - тыркаем в весы, Вам не сложно, а мне приятно
Mifody вне форума Ответить с цитированием
Старый 31.03.2011, 15:21   #3
vebster35
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 11
По умолчанию

Цитата:
Mifody
Цитата:
эээ, 180 Мб это что? размер страницы
хотя подозреваю, что просто суммарный объем данных.
да это и имелось ввиду.
Цитата:
если последнее, скорее всего утечка памяти "шалит", тогда:
1. посмотреть как Ваша программа "жрет" память через диспетчер задач, если идет постоянный прирост памяти, то:
2. искать утечку памяти в своем коде (хотя утечка может быть и в коде компонент), если глазками не получается, то:
3. поставить менеджер утечки памяти (или как он там называется правильно). У Вас не понятно какая версия делфей, у меня Delphi 7 и использую MemProof. Вещь древняя, но найти можно и ловит утечки на ура.
Нет утечки нет. проверял и по диспетчеру задач и через MemProof. память как использовалась первоначально ~5-8мб так и используется до "зависания". использую Delphi 7.
Цитата:
что накапливал большие объемы в переменных перед сбросом в базу
Переменные относящиеся к процедуре получения и парсинга страниц, после каждого цикла очищаются, то и странно что происходит такое явление
vebster35 вне форума Ответить с цитированием
Старый 31.03.2011, 15:46   #4
vebster35
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 11
По умолчанию

Забыл также указать: использую Indy версии 10.5.7
vebster35 вне форума Ответить с цитированием
Старый 31.03.2011, 15:51   #5
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

если там индюк только для банального GET, то переписать минут за 20 на синапсе и посмотреть, что получится.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 31.03.2011, 15:55   #6
vebster35
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 11
По умолчанию

Цитата:
veniside
а пример можешь подкинуть?
vebster35 вне форума Ответить с цитированием
Старый 31.03.2011, 15:57   #7
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

вторая ссылка в моём гугле по запросу synapse delphi:

http://parsing-and-i.blogspot.com/20...rst-steps.html
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 31.03.2011, 16:09   #8
vebster35
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 11
По умолчанию

Ок. Спасибо. перепишу на нем, посмотрю что выйдет. если честно все время использовал Indy, о таком компоненте первый раз слышу
vebster35 вне форума Ответить с цитированием
Старый 02.04.2011, 17:13   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а можно код того как вы делали?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.04.2011, 12:55   #10
vebster35
Пользователь
 
Регистрация: 09.01.2011
Сообщений: 11
По умолчанию

Пепел Феникса,
Код:
strmn:= IdHTTP1.Get('http://site.com/index.php');
IdHTTP1.Socket.Close;
IdHTTP1.Disconnect;

 picf:= Pars('значение1', strmn, 'значение2');

if picf <> '' then
begin
//выполнение команд
end
else
begin
IdHTTP1.Disconnect;
strmn:= '';
// очередной запуск на выполнение вышенаписанного кода
Скажу наперед, что добавив
Код:
Application.ProcessMessages;
в события IdHTTP
Код:
WorkBegin и WorkEnd
, а также
Код:
IdHTTP1.Socket.Close;
и
Код:
IdAntiFreeze
набралось порядка 400мб и пока что полет нормальный
vebster35 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с авторизацией через IdHttp ]Wowan[ Работа с сетью в Delphi 13 20.01.2011 02:42
WEB программисту-Требуется форма с запросом (наверное через iframe) allpc Фриланс 0 26.11.2010 15:09
Проблемы с POST запросом через cURL LonRv PHP 0 28.12.2009 17:56
двумерный динамический массив с запросом к пользователю о кол-ве строк и столбцов? vasyapupkin Общие вопросы C/C++ 2 22.11.2009 17:37
1 Мегабайт Xardas Свободное общение 11 24.02.2008 13:38