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

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

20.12.2012, 20:56. Показов 2164. Ответов 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru