Jak przyspieszyć operacje Batch API?

12

Natknąłem się na to zarówno z zewnętrznymi modułami contrib, jak i niektórymi z moich własnych operacji. Jestem ciekawy różnych sposobów na przyspieszenie operacji wsadowych / contrib ?

Załóżmy, że pracują z węzłami (import / aktualizacja itp.), A my mamy do czynienia z analizowaniem list węzłów w zakresie ponad 10 000 (chociaż miałem do czynienia z 15 milionami wierszy .. co tak - jestem po prostu przykręcony. .)

Czy szybciej jest dołączyć do zadania cron.php drupals i uruchomić „bez głowy”? Używasz Drusha? czy jest to po prostu pytanie o to, jak wydajne i szybkie parsowanie mogę rozwinąć swój kod i nie ma zewnętrznych wpływów ani wskazówek dotyczących optymalizacji wsadowej ...

Obecnie natknąłem się na operacje, które (przy użyciu przybliżonych obliczeń) mogą potrwać ponad 24 godziny ...

Dzięki!

electblake
źródło

Odpowiedzi:

9

Nie działa to dla kodu contrib, ale jeśli jest to twój kod i dobrze go znasz, polecam napisanie komendy drush, aby wykonać tę pracę. W ramach drush ogranicz funkcję drupal_bootstrap () do odpowiedniego poziomu bootstrap. Nie pamiętam faktycznych liczb, ale bardzo duży procent czasu na każde żądanie drupala spędza się na bootstrapie, i można tam zaoszczędzić dużo czasu.

Ponadto sprawdź wnętrzności modułu Migrate. Nie wiem, jak to się robi, że to mojo (nigdy nie poświęciłem czasu na to, żeby się zorientować), ale może bardzo szybko płonąć przez ogromne partie węzłów.

justintime
źródło
Dzięki za wkład - przyjrzę się bliżej modułowi migracji, a ten drupal_boostrap był również świetną wskazówką;)
electblake 30.03.11
8

Każde wywołanie partii jest żądaniem HTTP. Musisz więc znaleźć idealne połączenie liczby iteracji, które możesz przetworzyć, zanim uruchomione zostanie kolejne żądanie HTTP. Dwie rzeczy do rozważenia to pamięć i maksymalny czas wykonania. Będziesz chciał przetworzyć jak najwięcej iteracji na partię, aby zmniejszyć liczbę żądań HTTP, ponieważ są one najprawdopodobniej winowajcą wolnej partii.

Jeśli partia jest po prostu zbyt ciężka, aby działała wydajnie, możesz zamiast tego spróbować użyć kolejki. Tutaj jest dobra prezentacja partii vs. kolejki http://sf2010.drupal.org/conference/sessions/batch-vs-queue-api-smackdown . Kolejki nie dostarczają opinii użytkowników i mogą być uruchamiane równolegle.

Jeśli potrzebujesz informacji zwrotnych od użytkowników, jesteś przywiązany do partii, ale możesz nawet użyć kolejki w partii, aby spróbować ją zoptymalizować.

Jepedo
źródło
2

Jak inni powiedzieli, Drush jest dobrym rozwiązaniem, ale kolejka jest doskonałym narzędziem do użycia. Batch API w Drupal 7 wykorzystuje wbudowany rdzeń API kolejki, więc jeśli używasz MySQL, twój proces może być wąski. Ale interfejs API kolejki Drupala 7 można podłączyć, więc możesz użyć innego systemu kolejek, takiego jak beanstalkd.

bjeavons
źródło
1

Jeśli potrafisz zrobić to równolegle, to dobry początek. Oto kilka moich przemyśleń na ten temat, ponieważ wykorzystałem 4 wątki do zindeksowania ponad miliona stron wcześniej (poprzez boost). Chcemy, aby teraz został uogólniony. http://groups.drupal.org/node/126624

mikeytown2
źródło