Форум по Delphi программированию

 



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.01.2021, 10:53
noobofthenoobs noobofthenoobs вне форума
Прохожий
 
Регистрация: 19.01.2021
Сообщения: 2
Версия Delphi: Delphi 10.3
Репутация: 10
По умолчанию twebbrowser - память и скорость работы

Здравствуйте. Мне периодически нужно распознавать пачки картинок (что на них изображено) Использую Яндекс.картинки для распознавания. Написал небольшой парсер - кинул на форму twebbrowser и пару memo - для входных ссылок и выходных слов.

Примерно так:
Код:
procedure TForm1.Button1Click(Sender: TObject); //запуск поиска
begin
	webbrowser1.Tag:=0;
	webbrowser1.Navigate('https://yandex.ru/images/search?source=collections&rpt=imageview&url='+memo1.Lines[0]);		//ищем по первой ссылке
end;

Код:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; const URL: OleVariant);
  var doc:IHTMLDocument2;
begin
    application.ProcessMessages;
    if ((pdisp as iwebbrowser)= (ASender as TWebBrowser).DefaultInterface) then 	//проверяем, что фрейм полностью загрузился
    begin
        (Asender as twebbrowser).defaultInterface.Document.QueryInterface(IHtmlDocument2,doc);
        parse_yandex(doc.body.innerHTML, memo2); //передаю в функцию парсера html-текст и целевое memo
    (asender as Twebbrowser).tag:=(asender as Twebbrowser).tag+1;	//tag показывает, какую по счету ссылку обрабатывает webbrowser
    if (asender as Twebbrowser).tag<memo1.Lines.Count then		//пока не дошли до конца, продолжаем искать по следующей ссылке
      (asender as Twebbrowser).Navigate('https://yandex.ru/images/search?source=collections&rpt=imageview&url='+memo1.Lines[(asender as Twebbrowser).tag])

     end;

end;

Код:
procedure tform1.parse_yandex(curhtml:string;memo:tmemo);
var
st,m, count,mparsestart,mparseend,curline:integer;

begin
   m:=1;
   count:=0;
   memo.Lines.add('');
   curline:=memo.Lines.Count-1;
   st:=pos('Кажется, на изображении',curhtml); //начало поиска
   while m>0 do
   begin
   	count:=count+1;
          	m:=posex('Button2-Text',curhtml,st);
          	if m>0 then
          	begin
               		mparsestart:=m+14;                                         //получаем начало слова
            		mparseend:=posex('/span',curhtml,mparsestart)-1;           //получаем конец слова
            		memo.lines.BeginUpdate;
            		memo.Lines[curline]:=memo2.Lines[curline]+copy(curhtml,mparsestart,mparseend-mparsestart)+' ';
	                memo.lines.endUpdate;
            		st:=mparseend;                                             //переходим к следующей выдаче.
                 end;
     end;
end;

Вроде как все работает, но есть пару моментов:

- Можно ли как-то ускорить работу, не прибегая к многопоточности (я пробовал искать в нескольких потоках, но тогда периодически банят и нужно вводить капчи).
- Программа по ходу поиска новых картинок отжирает все больше памяти. Допустим найти 64 штуки обходится в 800-900 Мб, а если около сотни то может и вылететь с ошибкой о том, что недостаточно памяти, когда используемая память достигает 1.3-1.4 Гб (при этом на компьютере 16гб).

Что можете посоветовать?
Ответить с цитированием
  #2  
Старый 20.01.2021, 01:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,649
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

По поводу нажора памяти. Похоже, twebbrowser просто не освобождает память (такое наблюдается и в обычном IE). Так что тут только один рецепт - освобождать компонент и создавать его заного. Ну или попробовать перейти на Chromium.

По поводу недостаточности памяти - похоже, что у тебя приложение 32-bit, оно по умолчанию не может взять более 2 Гб памяти (это всего, не забывай, что часть адресного пространства занята образами системы, так что как раз тебе и остается около 1.5 Гб). С помощью разных ухищрений можно увеличить лимит до 3 Гб. Кардинальное решение - переход на 64-bit.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:46.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter