Comment accélérer les opérations de l'API Batch?

12

J'ai rencontré cela à la fois avec des modules contrib tiers et avec certaines de mes propres opérations. Je suis curieux de savoir comment accélérer mes opérations par lots / contrib ?

Supposons qu'ils fonctionnent avec des nœuds (importation / mise à jour, etc.) et que nous ayons à analyser des listes de nœuds dans la plage 10 000+ (bien que j'ai dû traiter 15 millions de lignes .. ce qui oui - je suis juste foutu. .)

Est-il plus rapide de s'attacher au travail cron.php de drupals et d'exécuter "sans tête"? Vous utilisez Drush? ou est-ce simplement une question de savoir comment une analyse efficace et rapide je peux développer mon code et il n'y a pas d' influences extérieures ou de conseils d'optimisation spécifiques au lot ...

Actuellement, j'ai rencontré des opérations qui (en utilisant un calcul approximatif) pourraient prendre plus de 24 heures ...

Merci!

electblake
la source

Réponses:

9

Cela ne fonctionne pas pour le code contrib, mais si c'est votre code et que vous le connaissez bien, je recommande d'écrire une commande drush pour faire le travail. Dans drush, limitez drupal_bootstrap () au niveau de bootstrap approprié. Je ne me souviens pas des chiffres réels, mais un très grand pourcentage de temps pour chaque demande drupal est passé en bootstrap, et vous pouvez y gagner beaucoup de temps.

De plus, découvrez les tripes du module Migrate. Je ne sais pas comment ça se fait, c'est mojo (jamais pris le temps de le faire), mais il peut exploser à travers d'énormes lots de nœuds très rapidement.

justintime
la source
Merci pour la contribution - je vais me pencher davantage sur le module de migration et ce drupal_boostrap était aussi un excellent conseil;)
electblake
8

Chaque appel batch est une requête HTTP. Vous devez donc trouver la combinaison parfaite du nombre d'itérations que vous pouvez traiter avant qu'une autre requête HTTP ne soit déclenchée. Deux choses à considérer sont la mémoire et le temps d'exécution maximum. Vous souhaiterez traiter autant d'itérations que possible par lot pour réduire le nombre de requêtes HTTP car elles sont probablement le coupable de votre lot lent.

Si votre lot est trop lourd pour fonctionner efficacement, vous pouvez essayer d'utiliser une file d'attente à la place. Il y a une bonne présentation batch vs file d'attente ici http://sf2010.drupal.org/conference/sessions/batch-vs-queue-api-smackdown . Les files d'attente ne fournissent pas de commentaires aux utilisateurs et peuvent être exécutées en parallèle.

Si vous avez besoin des commentaires des utilisateurs, vous êtes lié au lot, mais vous pouvez même utiliser la file d'attente dans votre lot pour essayer de l'optimiser.

Jepedo
la source
2

Comme d'autres l'ont dit, Drush est une bonne solution, mais une file d'attente est un excellent outil à utiliser. L'API Batch dans Drupal 7 utilise l'API de file d'attente principale intégrée, donc si vous utilisez MySQL, votre processus pourrait y être goulot d'étranglement. Mais, l'API Queue de Drupal 7 est enfichable, vous pouvez donc utiliser un autre système de file d'attente comme beanstalkd.

bjeavons
la source
1

Si vous pouvez le faire en parallèle, c'est un bon début. Voici quelques-unes de mes réflexions à ce sujet, car j'ai déjà utilisé 4 threads pour parcourir plus d'un million de pages (via boost). Vous cherchez à le généraliser maintenant. http://groups.drupal.org/node/126624

mikeytown2
la source