Wie beschleunige ich Batch-API-Vorgänge?

12

Ich bin sowohl mit Modulen von Drittanbietern als auch mit einigen meiner eigenen Operationen darauf gestoßen. Ich bin neugierig auf die verschiedenen Möglichkeiten, meine Batch-Vorgänge zu beschleunigen .

Angenommen, sie arbeiten mit Knoten (Import / Update usw.) und wir haben es mit Parsing-Listen von Knoten im Bereich von über 10.000 zu tun (obwohl ich mit 15 Millionen Zeilen zu tun hatte). .)

Ist es schneller, sich an drupals cron.php-Job anzuschließen und "kopflos" zu laufen? Verwenden Sie Drush? oder ist dies einfach eine Frage der Effizienz und Schnelligkeit des Parsings, mit der ich meinen Code entwickeln kann und ohne äußere Einflüsse oder chargenspezifische Optimierungstipps ...

Momentan bin ich auf Operationen gestoßen , die (mit groben Berechnungen) mehr als 24 Stunden dauern könnten ...

Vielen Dank!

electblake
quelle

Antworten:

9

Dies funktioniert nicht für Contrib-Code, aber wenn es Ihr Code ist und Sie ihn gut kennen, empfehle ich, einen Drush-Befehl zu schreiben, um die Arbeit zu erledigen. Begrenzen Sie innerhalb von drush drupal_bootstrap () auf die entsprechende Bootstrap-Ebene. Ich kann mich nicht an die tatsächlichen Zahlen erinnern, aber ein sehr großer Prozentsatz der Zeit für jede Drupal-Anfrage wird in Bootstrap verbracht, und Sie können dort viel Zeit sparen.

Überprüfen Sie außerdem die Eingeweide des Migrate-Moduls. Ich weiß nicht, wie es funktioniert, es ist Mojo (ich habe mir nie die Zeit genommen, es zu grillen), aber es kann sehr schnell durch große Mengen von Knoten brennen.

gerade rechtzeitig
quelle
Vielen Dank für die Eingabe - ich werde mich mehr mit dem Migrationsmodul befassen und dass drupal_boostrap auch ein großartiger Tipp war;)
electblake
8

Jeder Batch-Aufruf ist eine HTTP-Anforderung. Sie müssen also die perfekte Mischung aus der Anzahl der Iterationen finden, die Sie verarbeiten können, bevor eine andere HTTP-Anforderung ausgelöst wird. Zwei Dinge zu beachten sind Speicher und maximale Ausführungszeit. Sie sollten so viele Iterationen wie möglich pro Batch verarbeiten, um die Anzahl der HTTP-Anforderungen zu verringern, da dies höchstwahrscheinlich die Ursache für Ihren langsamen Batch ist.

Wenn Ihr Stapel einfach zu schwer ist, um effizient ausgeführt zu werden, können Sie stattdessen eine Warteschlange verwenden. Hier gibt es eine gute Darstellung von Batch vs. Queue: http://sf2010.drupal.org/conference/sessions/batch-vs-queue-api-smackdown . Warteschlangen geben kein Benutzerfeedback und können parallel ausgeführt werden.

Wenn Sie Benutzerfeedback benötigen, sind Sie an einen Stapel gebunden. Sie können jedoch auch die Warteschlange in Ihrem Stapel verwenden, um zu versuchen, ihn zu optimieren.

Jepedo
quelle
2

Wie andere gesagt haben, ist Drush eine gute Lösung, aber eine Warteschlange ist ein großartiges Werkzeug. Die Batch-API in Drupal 7 verwendet die integrierte Queue-Kern-API. Wenn Sie also MySQL verwenden, kann Ihr Prozess dort Engpässe aufweisen. Die Warteschlangen-API von Drupal 7 ist jedoch steckbar, sodass Sie ein anderes Warteschlangensystem wie beanstalkd verwenden können.

bjeavons
quelle
1

Wenn Sie es parallel machen können, ist das ein guter Anfang. Hier sind einige meiner Gedanken dazu, da ich zuvor mit 4 Threads über eine Million Seiten gecrawlt habe (via Boost). Ich möchte es jetzt verallgemeinern. http://groups.drupal.org/node/126624

mikeytown2
quelle