Szybsze parsowanie stron internetowych – c.d. z serwisem www.filmydokumentalne.eu

movieWe wczorajszym wpisie opisałem sposób pobrania bazy danych filmów ze strony www.filmydokumentalne.eu. Wszystko byłoby w porządku, gdyby nie fakt, że wykonanie kompletnego importu trwa ok. jednej godziny.

Dlatego dzisiaj dodaję do programu obsługę wielowątkową, dzięki której nasz program dostanie znacznego przyspieszenia.

Cel jest taki, aby posiadając wielordzeniowy procesor wykorzystać jego pełne możliwości (jednoczesne pobieranie kilku podstron serwisu)

Zaczynamy

Na początek ustawmy liczbę wykorzystywanych wątków:

Tworzymy obiekt ThreadPoolExecutor:

Po czym zlecamy wykonanie odczytu dla każdej podstrony jako osobne zadanie:

W zmiennej result zapisana będzie lista wszystkich filmów. Ze względu na dostęp wielowątkowy zrezygnowałem z aktualizacji pliku w locie, na rzecz wprowadzenia kolejki ConcurrentLinkedQueue, którą wszystkie wątki będą aktualizowały. Zapisując dane bezpośrednio do pliku przez każdy z wątków należałoby obsłużyć lockowanie / synchronizację.

To co pozostaje do zrobienia, to zapis wyników do pliku:

Gotowe

Po uruchomieniu zaktualizowanego programu czas wykonania importu zmniejszył się z godziny, do ok. siedmiu minut (na moim procesorze Intel I5-2400 z czterema rdzeniami). Na czas wykonania programu duży wpływ ma oczywiście szybkość łącza internetowego, w moim przypadku jest to 10Mb/s.

Kończąc wpis, chciałbym jeszcze zwrócić uwagę na ilość wykonywanych żądań do zewnętrznej strony. W tym przypadku siedem minut na 4900 podstron daje ok. 12 żądań na sekundę. Może się zdarzyć, że docelowy serwis nie wytrzyma założonego przez nas obciążenia i zablokujemy stronę. Możemy być wtedy posądzeni od atak typu DOS. To bardzo ważne aby dobrać odpowiednie parametry programu do konkretnego serwisu.

To również może Cię zainteresować:

  • Mapowanie XML obiektów Java – JAXBMapowanie XML obiektów Java – JAXB Podczas tworzenia oprogramowania na każdym kroku mamy kontakt z danymi w formacie XML. Opiszę tutaj jeden ze sposobów konwersji danych w obie strony Java <-> XML. Ale na […]
  • Permutacje, cz. 2 – algorytmyPermutacje, cz. 2 – algorytmy W poprzednim wpisie programistyczne rozwiązanie zagadki polegało na wygenerowaniu wszystkich permutacji zbioru i sprawdzeniu każdej z nich pod względem spełnienia warunku […]
  • Odczyt tekstu z plików PDF w JavieOdczyt tekstu z plików PDF w Javie Załóżmy, że zlecono nam wykonanie zadania odczytu faktur od klientów. Dokumenty będziemy otrzymywać w plikach PDF, z których należy pobrać pewne dane tekstowe. Poniżej przedstawię dwa […]
  • PHP 7 został wydanyPHP 7 został wydany 3 grudnia 2015 została wydana oficjalna wersja PHP 7.0.0., w której wydajność w stosunku do PHP 5.6 została zwiększona nawet dwukrotnie. To, na co prawie każdy programista PHP czekał, to […]
  • Java i listing wszystkich plików w kataloguJava i listing wszystkich plików w katalogu W ostatnim czasie musiałem przerobić jeden z systemów na wersję wielojęzykową. Chodziło dokładnie o to, aby wszystkie Stringi zostały wywołane przez tzw. wrapper ze wstrzyknięciem pewnego […]
  • Wzorce projektowe – singletonWzorce projektowe – singleton Singleton - jeden ze wzorców konstrukcyjnych. Jego celem jest zapewnienie możliwości utworzenia tylko jednego obiektu danej klasy i zapewnienie do niego globalnego dostępu. Przez wielu […]

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *