Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700

Слишком медленно парсится. можна ли как то ускорить

20.12.2012, 20:56. Показов 2196. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Выдираю вообщем с html странички по тегам информацию которую мне нужно.. вроде всё работает, но ужасно медленно :/
Привожу код функции... (почти всё завязано на substring) интересно.. есть ли способ сделать это быстрее.. или хотя бы ускорить то, что имеется:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
AnsiString getResult(AnsiString fulltext,AnsiString tagStart,AnsiString tagEnd,int indexof)
{
    AnsiString alltext = fulltext;
    AnsiString returnResult="";
 
    int poss1,poss2;
    int xpos1,xpos2;
    poss1=0;
    poss2=0;
    xpos1=0;
    xpos2=0;
    AnsiString tempString ="";
    AnsiString hardline = "<li id=\"ListBox";
 
    hardline = hardline+indexof;
    hardline = hardline + "\"";
    xpos1 =alltext.Pos(hardline);
 
        tempString = alltext.SubString(xpos1,alltext.Length()-hardline.Length()-xpos1);
        Form1->Memo4->Text = tempString;
        xpos2 =tempString.Pos("</li>");
        xpos1 =tempString.Pos(hardline);
        tempString =tempString.SubString(xpos1+hardline.Length(),xpos2-xpos1-hardline.Length());
        //нашли одну ячейку.. теперь добывает по тегам
 
        poss1=tempString.Pos(tagStart);
        tempString = tempString.SubString(poss1,tempString.Length()-tagStart.Length()-poss1);
        poss1=tempString.Pos(tagStart);
        poss2=tempString.Pos(tagEnd);
 
        returnResult = tempString.SubString(poss1+tagStart.Length(),poss2-poss1-tagStart.Length());
 
 
 
    return returnResult;
}
одновременно работает 5 функций.
таких..

стягиваю текст(html) таким способом
C++
1
2
3
4
5
6
TStringStream *response;
    response=new TStringStream();
    TStringList *tsl=new TStringList();
    Form1->IdHTTP1->Get(url,response);
    tsl->Text=response->DataString;
    Form1->Memo1->Text = tsl->Text;

Не по теме:

нагло стыренный с форума


Потом уже с мемо вырезаю кусок который нужен (обрезаю по <div> и оставляю только кусок , где содержатся мои обьекты)
Вообщем страница парсится(ну не парсится.. ну вырезается ) от 10 до 20 секунд
На странице до 30 элементов.. (скажем даже обьектов) и у каждого такого обьекта по 5 строчек которые я вытягиваю.

Может кто то знает быстрей способ.. или подскажет как тут ускорить :/

с ув. Petruchodd
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2012, 20:56
Ответы с готовыми решениями:

Очень медленно скачивает страницу (TIdHTTP). Как ускорить?
Скачивает страницу с любого сайта за 2-4 секунды. При этом браузер (Google Chrome) за полсекунды-полторы секунды отрабатывает. Из-за...

Решето Эратосфена (сегмент): медленно работает - как можно ускорить?
Подсчёт числа простых чисел в диапазоне от &quot;from&quot; до &quot;to&quot; typedef UINT64 Number; __device__ Number eratosthenesSingleBlock(const...

Народ а как можна сделать штоб можна было скачевать файлы через браузер в делфи
Народ а как можна сделать штоб можна было скачевать файлы через браузер в делфи

15
Марсианин)))
713 / 46 / 15
Регистрация: 18.07.2010
Сообщений: 637
20.12.2012, 21:08
Цитата Сообщение от petruchodd Посмотреть сообщение
Потом уже с мемо вырезаю кусок который нужен (обрезаю по <div> и оставляю только кусок , где содержатся мои обьекты)
То есть, вы работаете с Memo? Если да то перейдите на список, будет на много быстрее.
C++
1
TStringList *Stroka=new TStringList();
Просто Мемо медленный для этого.
1
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
20.12.2012, 21:12  [ТС]
Цитата Сообщение от Xank Посмотреть сообщение
То есть, вы работаете с Memo? Если да то перейдите на список, будет на много быстрее.
C++
1
TStringList *Stroka=new TStringList();
Просто Мемо медленный для этого.
ммм а как туда запихнуть результат который я стянул с инета
Просто в мемо я как бы впихиваю весь текст(грубо говоря всю страницу) оттуда вырезаю кусок и присваиваю его переменной ansistring потом уже с ansistringom продолжается работа.. но иногда всё так же требуется обратится где то в мемо
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 21:16
Цитата Сообщение от petruchodd Посмотреть сообщение
xpos2 =tempString.Pos("</li>"); xpos1 =tempString.Pos(hardline);
Искать надо с последней найденной позиции а не каждый раз сначала всего текста

А stl, boost/regex не пробовали ?

Добавлено через 3 минуты
Цитата Сообщение от Xank Посмотреть сообщение
То есть, вы работаете с Memo? Если да то перейдите на список, будет на много быстрее.
Сомневаюсь... тут ведь перерисовка не участвует...
0
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
20.12.2012, 21:20  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Искать надо с последней найденной позиции а не каждый раз сначала всего текста

А stl, boost/regex не пробовали ?

Добавлено через 3 минуты

Сомневаюсь... тут ведь перерисовка не участвует...
мм так я так и делал.
C++
1
tempString
постоянно обновлялась. Нашел где первое вхождение .. отрезал до конца файла. Потом нашел заверщающий тег куска. Обрезал. Получился кусочек где уже конкретно еще раз сабстрингаю для того, что бы достать нужный текст :/

а про boost/regex я даже не знаю че это :/
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 21:29
Если я нечего не путаю, то нужно использовать ф-цию PosEx() из StrUtils.hpp

https://www.cyberforum.ru/post898243.html

Добавлено через 1 минуту
Цитата Сообщение от petruchodd Посмотреть сообщение
Нашел где первое вхождение .. отрезал до конца файла.
Еще лучше ... отрезка вызывает перераспределение памяти и копирования - в общем тупняк..

Добавлено через 2 минуты
Цитата Сообщение от petruchodd Посмотреть сообщение
а про boost/regex я даже не знаю че это :/
Собственно не в одну тему уже писал и про IdHTTP и про boost/regex

Добавлено через 1 минуту
К примеру
Парсер boost/regex
Поиск ссылок в html-документе
2
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
20.12.2012, 21:30  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Если я нечего не путаю, то нужно использовать ф-цию PosEx() из StrUtils.hpp

https://www.cyberforum.ru/post898243.html


Еще лучше ... отрезка вызывает перераспределение памяти и копирования - в общем тупняк..


Поиск ссылок в html-документе

Так.. а как же тута лучше поступить ?Кроме substring я даж хз че еще можна поюзать :/
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 21:41
C++
1
2
xpos2 =tempString.Pos("</li>"); 
xpos1 =tempString.Pos(hardline);
А при чем тут SubStr() ?
У вас поиск каждый раз сначала строки tempString начинается... что тут не понятного..

Метод Pos() начинает искать каждый раз с начала строки т.е. с с 1-го элемента, в то время как можно начинать поиск основываясь на предыдущем поиске

Добавлено через 7 минут
P.S. насчет IdHTTP то можно грузить сразу в строку или в Memo без потоков ... https://www.cyberforum.ru/blog... og608.html
1
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
20.12.2012, 21:56  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
xpos2 =tempString.Pos("</li>"); 
xpos1 =tempString.Pos(hardline);
А при чем тут SubStr() ?
У вас поиск каждый раз сначала строки tempString начинается... что тут не понятного..

Метод Pos() начинает искать каждый раз с начала строки т.е. с с 1-го элемента, в то время как можно начинать поиск основываясь на предыдущем поиске

Добавлено через 7 минут
P.S. насчет IdHTTP то можно грузить сразу в строку или в Memo без потоков ... https://www.cyberforum.ru/blog... og608.html
Вообщем замерил таймером.. среднее выполнение одной и той же страницы с моим кодом идет 15-18 секунд. из них 2-8 занимает обработка функцией.

И очень много времени (12) тянется информация с сайта :/

вов за статью (ссылку) спасибо большое, пока писал и вычислял , не заметил что вы подправили пост. Спасибо большое , сейчас почитаю
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 22:04
Так что занимает время я так и не понял ... Парсинг или Загрузка с сайта ?

С парсингом вроде разобрались ...

Насчет загрузки можно попробывать компрессию применить ( см блог )

Добавлено через 7 минут
Насчет PosEx()

C++
1
2
3
4
5
6
String Text="1890234567890";
 
int first= PosEx("4",Text,1);
int second= PosEx("8",Text,first); 
 
Caption=  Text.SubString(first,second-first+1);  // 45678
1
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
20.12.2012, 22:09  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Так что занимает время я так и не понял ... Парсинг или Загрузка с сайта ?

С парсингом вроде разобрались ...

Насчет загрузки можно попробывать компрессию применить ( см блог )

Добавлено через 7 минут
Насчет PosEx()

C++
1
2
3
4
5
6
String Text="1890234567890";
 
int first= PosEx("4",Text,1);
int second= PosEx("8",Text,first); 
 
Caption=  Text.SubString(first,second-first+1);  // 45678
парсит от 2 до 8 .. .. А вот считка страницы сайта ~8-15;
C++
1
2
3
4
get page from url: 14640
get page from url: 8484
get page from url: 9281
get page from url: 13031
14,8.4,9.2,13 Сейчас почитаю про компрессию.. как только найду
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 22:18
Цитата Сообщение от petruchodd Посмотреть сообщение
14,8.4,9.2,13 Сейчас почитаю про компрессию.. как только найду
https://www.cyberforum.ru/blog... 8.html#a_9
1
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
21.12.2012, 03:52  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Вообщем попробовал компрессию.. . компонент есть. но выдает ошибку, что типа не может вызвать функцию( использовал пример с блога) у меня РАД студио 2009. ( блин((( а вот как раз именно считывание с веба , занимает самое большее время
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
21.12.2012, 14:23
Цитата Сообщение от petruchodd Посмотреть сообщение
у меня РАД студио 2009.
Ну так должно работать... у код из блога как раз на RAD2009 тестировал
Что-то не так делаете.

Добавлено через 11 минут
Декомпрессия принятой страницы

Добавлено через 39 минут
Кстати в RAD XE3 работает, только что проверил.
0
 Аватар для petruchodd
129 / 126 / 22
Регистрация: 23.06.2009
Сообщений: 700
29.12.2012, 21:39  [ТС]
Кому интересно на будущее. Memo очень медленное.. удалив полностью работу с ним и заменив всё на String смог добится время выполнения работы своего парсера с 3-10 секунд до 15-30 мс. С мемо минимум 3 секунды. WideString тоже медленный :/(покрайней мере у меня) AnsiString забил нафик )
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
29.12.2012, 21:43
Ну это ерунда ... тормоза в Memo возникают только если необходима перерисовка.

Ясное дело что если ты будеш получать с серва данные и сразу парсить то будет будет быстрее нежели получить, вывести в Memo ( тут перерисовка), а потом парсить.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.12.2012, 21:43
Помогаю со студенческими работами здесь

DataGridView слишком медленно
Здравствуйте, у меня появилась проблема. Есть таблица, которая должна обновляться каждый 2 секунды, но данные в ней обновляются не...

Система работает слишком медленно
Здравствуйте. У меня проблема. Компьютер тормозит, невозможно работать, возможно вирусы. Помогите пожалуйста! Заранее спасибо!

Windows XP работает слишком медленно
Добрый день. Есть дома второй компьютер, на нём батя вся в шашки играет) Я не чайник, с 15 лет ставил ХP сам и чем только не...

Интроспективная сортировка работает слишком медленно
Интроспективная сортировка (IntroSort) работает слишком медленно. Как улучшить алгоритм?

Слишком медленно работает перегруженный оператор
Скажите пожалуйста, почему медленно работает перегруженный оператор? BigInteger.h #ifndef BIGINT_H #define BIGINT_H #define...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru