Curl a preg_match_all w C++ i PHP

0

Witam,
musiałem "na szybko" napisać kod, który pobiera informacje (np: linki) z 10 stron (na próbę).
Użyłem do tego preg_match_all i wyszło mi że potrzebuję ok 20sec na 1 stronę czyli na np: 10 000 stron potrzebuję 200 000sec = 56h.

W php trzeba nadać odpowiedni czas timeout, więc wpisanie wartości 200000 trochę mija się z celem.

Dużo za dużo. Teraz moje pytania brzmią:

  1. Czy curl działa szybciej od preg_match_all ?
  2. Jeżeli w C++ napiszę podobny kod to o ile szybciej będzie w stanie pobrać taką ilość informacji ?
0
Zi00mal napisał(a)

Witam,
musiałem "na szybko" napisać kod, który pobiera informacje (np: linki) z 10 stron (na próbę).
Użyłem do tego preg_match_all i wyszło mi że potrzebuję ok 20sec na 1 stronę czyli na np: 10 000 stron potrzebuję 200 000sec = 56h.

Ile z tego to koszt IO, ile to faktyczna ekstrakcja danych z pobranej strony?

Zi00mal napisał(a)

W php trzeba nadać odpowiedni czas timeout, więc wpisanie wartości 200000 trochę mija się z celem.

Fakt, można po prostu wpisać 0.

Zi00mal napisał(a)
  1. Czy curl działa szybciej od preg_match_all ?

Czy krowa gra gorzej od telewizora?

Zi00mal napisał(a)
  1. Jeżeli w C++ napiszę podobny kod to o ile szybciej będzie w stanie pobrać taką ilość informacji ?

O tyle, o ile szybsze łącze podepniesz przy odpalaniu programu w C++.

Konkretnie: efektywne crawlery tworzy się w oparciu o programowanie współbieżne, do czego PHP się zupełnie nie nadaje. Wyrażenia regularne raczej nie są Twoim problemem, PCRE nie jest najwolniejszy, w C++ też byś z niego korzystał. Możesz sam napisać przetwarzanie tekstu zamiast zdawać się na interpreter wyrażeń regularnych, powinno dać spory zysk, chociaż tak naprawdę wszystko rozbija się o szybkość sieci i współbieżność. Curl to biblioteka do obsługi HTTP, dostępna także w PHP, tak samo jak i PCRE dla wyrażeń regularnych (preg_match_all etc), bezpośrednie przepisanie z PHP na C++ niewiele zmieni.

0
night crawler napisał(a)
Zi00mal napisał(a)

Witam,
musiałem "na szybko" napisać kod, który pobiera informacje (np: linki) z 10 stron (na próbę).
Użyłem do tego preg_match_all i wyszło mi że potrzebuję ok 20sec na 1 stronę czyli na np: 10 000 stron potrzebuję 200 000sec = 56h.

Ile z tego to koszt IO, ile to faktyczna ekstrakcja danych z pobranej strony?

Pobieram całą treść i przeszukuję preg_match_all().

night crawler napisał(a)
Zi00mal napisał(a)

W php trzeba nadać odpowiedni czas timeout, więc wpisanie wartości 200000 trochę mija się z celem.

Fakt, można po prostu wpisać 0.

Racja, mimo to chodzi mi o głupotę czekania kilkudziesięciu godzin.

night crawler napisał(a)

Konkretnie: efektywne crawlery tworzy się w oparciu o programowanie współbieżne, do czego PHP się zupełnie nie nadaje. Wyrażenia regularne raczej nie są Twoim problemem, PCRE nie jest najwolniejszy, w C++ też byś z niego korzystał. Możesz sam napisać przetwarzanie tekstu zamiast zdawać się na interpreter wyrażeń regularnych, powinno dać spory zysk, chociaż tak naprawdę wszystko rozbija się o szybkość sieci i współbieżność. Curl to biblioteka do obsługi HTTP, dostępna także w PHP, tak samo jak i PCRE dla wyrażeń regularnych (preg_match_all etc), bezpośrednie przepisanie z PHP na C++ niewiele zmieni.

Czyli najszybsze rozwiązanie to napisać w C++ z użyciem własnych funkcji ?

0
Zi00mal napisał(a)

Pobieram całą treść i przeszukuję preg_match_all().

Yhy, ale pytałem o co innego. Ile czasu z całości to pobranie treści, ile ekstrakcja właściwych danych?

Zi00mal napisał(a)

Czyli najszybsze rozwiązanie to napisać w C++ z użyciem własnych funkcji ?

Najszybsze rozwiązanie to współbieżność, czy to będzie Haskell, Erlang, Scala, czy nawet JavaScript to sprawa drugorzędna. Wysyłasz request, serwer musi przygotować odpowiedź, ta leci chwilę, czy przez ten czas wykorzystujesz swoje łącze i moc w obliczeniową w 100%? No właśnie: kiedy czekasz na pobranie kompletnej odpowiedzi to program jest bezczynny, mógłby przecież równocześnie pobierać też inne strony i parsować już pobrane. Kiedy wysyłasz request i czekasz aż serwer przygotuje odpowiedź to też nic do Ciebie po kablu nie leci, a przecież by mogła lecieć treść innej strony.

0
night crawler napisał(a)

Yhy, ale pytałem o co innego. Ile czasu z całości to pobranie treści, ile ekstrakcja właściwych danych?

Chyba nie umiem odpowiedzieć. Puszczam po prostu całość i wiem że czas na wykonanie to 30sek + 25sek na wyświetlenie.

night crawler napisał(a)

Czyli najszybsze rozwiązanie to napisać w C++ z użyciem własnych funkcji ?
Najszybsze rozwiązanie to współbieżność, czy to będzie Haskell, Erlang, Scala, czy nawet JavaScript to sprawa drugorzędna. Wysyłasz request, serwer musi przygotować odpowiedź, ta leci chwilę, czy przez ten czas wykorzystujesz swoje łącze i moc w obliczeniową w 100%? No właśnie: kiedy czekasz na pobranie kompletnej odpowiedzi to program jest bezczynny, mógłby przecież równocześnie pobierać też inne strony i parsować już pobrane. Kiedy wysyłasz request i czekasz aż serwer przygotuje odpowiedź to też nic do Ciebie po kablu nie leci, a przecież by mogła lecieć treść innej strony.

O kurczę trudna sprawa. Myślałem że to nie jest tak skomplikowane. Chcę napisać program do pobierania np.: e-mail różnych firm z serwisu np.: pkt.pl

Chyba najlepszy do tego będzie język Scala. Czy masz może jakieś doświadczenie z którymś z tych języków ?

Proszę wrzucić jako Edit:
Źle policzyłem. Wykonuje mi 10 stron w ok 2min, czyli 250 firm.

Jeżeli potrzebuję pobrać 10 000 firm to wyjdzie ok. 80 minut. Jest bardzo spoko :D

Sprawdzę czy działa i napiszę jutro.
Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1