![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 1 Dołączył: 14.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam serdecznie
![]() Jak zwykle piszę z problemem. Otóż mój skrypt wykonuje pętle (while) i przy każdym wykonaniu zapisuje dane do bazy. Skrypt wykonuje się do momentu przekorczenia czasu wykonywania. Chodzi po prostu o to, by pętli wykonało się jak najwięcej, nie chcę ograniczać tego do konkretnej wartości, bo w zależności od danych raz potrafi przejść 5 pętli, a innym razem 30. No i sporo już myślałem nad tym, w jaki sposób ominąć zapisywanie danych co każdą pętlę (generuje to spore obciążenia). Pomsł mam taki, by dane przechowywać w tablicy i w odpowiednim momencie (przed zakończeniem czasu wykonywania) zapisać do bazy. Wymagałoby to porównywania czasu rozpoczęcia pierwszej pętli z obecnym i na przykład po upływie 50 sekund przerwać pętlę i zrobić zapis. Są jeszcze jakiś inne sposoby? |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Spróbuj zapisywać dane do pliku na dysku, a po zakończeniu ich zapisywania odpal LOAD DATA INFILE. Powinno być zdecydowanie bardziej wydajne.
Inna sprawa, to podane przez Ciebie wartości: od 5 do 30 przebiegów pętli. Przyjmując domyślny czas wykonywania skryptów (30 sekund) daje to od 1 do 6 sekund na jeden przebieg pętli. Trochę dużo... stawiam na problemy wewnątrz samej pętli. Zawsze możesz również wydłużyć czas wykonywania skryptu. |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 86 Pomógł: 16 Dołączył: 2.12.2009 Skąd: Płock/Warszawa Ostrzeżenie: (0%) ![]() ![]() |
daj w środku pętli:
jęzeli możesz zmienić limit (uwarunkowania serwera) to masz 20 sekund na każdy obieg pętli ale to nie zmienia faktu, że coś długo trwają te operacje w petli i bardziej uważnie bym im się przyjrzał |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 1 Dołączył: 14.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
W pętli pobierane są dane z innych stron (curl), stąd długi czas wykonywania 1 pętli.
Zapisywanie danych do pliku w każdej pętli, a później zrzut całości do bazy zmniejszy obciążenie? |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
W pętli generuj tylko zapytanie i np. co 10 przebiegów je wykonuj:
Choć przy dużej ilości stron pobieranych curl-em może to niewiele pomóc. Ten post edytował mortus 31.08.2011, 09:07:23 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 1 Dołączył: 14.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Każda nawet najmniejsza optymalizacja zapytań to dobry pomysł
![]() Wykonywanie zapytań co kilka kroków jest o tyle zła, że niektóre dane nie zostaną zapisane. Na przykład ustawię zapisywanie co 3 pętle, wykona mi 10 pętli, wtedy tracę dane z wykonania ostatniej. A tego nie chcemy ![]() A co myślicie o moim pomyśle, by porównywać czas i w odpowiednim momencie przerwać pętle? Połączyłbym to ze sposobem podanym przez mortusa (dziękuję za pomysł). |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Cytat Wykonywanie zapytań co kilka kroków jest o tyle zła, że niektóre dane nie zostaną zapisane. Na przykład ustawię zapisywanie co 3 pętle, wykona mi 10 pętli, wtedy tracę dane z wykonania ostatniej. A tego nie chcemy smile.gif Zauważ, że dzięki warunkowi || $i == $count - 1 zostaną zapisane wszystkie dane:
EDIT Choć wtedy trzeba troszkę zmodyfikować kod:
Co do Twojego pomysłu, to co będzie z danymi, które nie zostaną przetworzone? Wznowisz wykonywanie skryptu? Ten post edytował mortus 31.08.2011, 10:10:42 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 1 Dołączył: 14.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Tak, zostanie to wznowione.
Na przykład mam w sumie 50 zadań do wykonania w pętli. Za pierwszym razem wykona się 15, to następna pętla zaczyna się od 16. Nie wiem czy dobrze zrozumiałem, ale w Twoim przykładzie chyba zakładasz, że z góry została założona ilość pętli i zostannie ona wykonana do końca. Mój skrypt bardzo rzadko wykonuje wszystkie zaplanowane pętle. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 2 178 Pomógł: 596 Dołączył: 25.09.2009 Skąd: Piwniczna-Zdrój Ostrzeżenie: (0%) ![]() ![]() |
Czyli wygląda na to, że ten CURL u Ciebie działa raz szybciej, raz wolniej i w sumie to nie wiesz, kiedy braknie czasu na dokończenie działania skryptu. To w takim razie Twoje rozwiązanie może być dobre, ale nie wiem, czy warto porównywać czas, czy może na sztywno ustalić przeładowania strony np. co 5 przebiegów pętli. Trzeba pamiętać, że od momentu, w którym porównasz czasy, do momentu w którym nastąpi przeładowanie strony też trochę czasu mija (choć może niewiele).
Nie bawiłem się jeszcze tym, ale można by było spróbować zasymulować wielowątkowość do wygenerowania zapytań/nia SQL (niestety to co znalazłem w sieci działa tylko na *nix-ach). |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 21 Pomógł: 1 Dołączył: 14.05.2009 Ostrzeżenie: (0%) ![]() ![]() |
Dzięki serdecznie
![]() ![]() |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 05:41 |