Come velocizzare le operazioni dell'API batch?


12

Mi sono imbattuto in questo sia con moduli contrib di terze parti che con alcune delle mie operazioni. Sono curioso di sapere come posso accelerare le mie operazioni batch / contrib ?

Supponiamo che funzionino con i nodi (import / update, ecc.) E abbiamo a che fare con l'analisi delle liste di nodi nell'intervallo di oltre 10.000 (anche se ho dovuto gestire 15 milioni di righe .. che sì - sono solo fregato. .)

È più veloce collegarsi al lavoro cron.php di drupals ed eseguire "senza testa"? Usi Drush? o si tratta semplicemente di una questione di come efficiente e l'analisi rapida posso sviluppare il mio codice e non ci sono nessun influenze esterne o suggerimenti per l'ottimizzazione dei lotti specifici ...

Attualmente ho eseguito operazioni che (utilizzando alcuni calcoli approssimativi) potrebbero richiedere più di 24 ore ...

Grazie!

Risposte:


9

Questo non funziona per il codice contrib, ma se è il tuo codice e lo conosci bene, ti consiglio di scrivere un comando drush per fare il lavoro. All'interno di drush, limitare drupal_bootstrap () al livello bootstrap appropriato. Non riesco a ricordare i numeri reali, ma una percentuale molto grande di tempo per ogni richiesta di drupal viene spesa in bootstrap, e qui puoi risparmiare molto tempo.

Inoltre, controlla l'intestino del modulo Migrate. Non so come sia il mojo (non ci è mai voluto del tempo per farlo), ma può divampare molto rapidamente attraverso enormi gruppi di nodi.


Grazie per l'input: esaminerò di più il modulo di migrazione e che drupal_boostrap è stato anche un ottimo suggerimento;)
electblake

8

Ogni chiamata batch è una richiesta HTTP. Quindi è necessario trovare la combinazione perfetta di quante iterazioni è possibile elaborare prima che un'altra richiesta HTTP venga attivata. Due cose da considerare sono la memoria e il tempo massimo di esecuzione. Ti consigliamo di elaborare quante più iterazioni possibili per batch per ridurre il numero di richieste HTTP in quanto sono probabilmente il colpevole del tuo batch lento.

Se il batch è troppo pesante per essere eseguito in modo efficiente, è possibile provare a utilizzare una coda. C'è una buona presentazione batch vs code qui http://sf2010.drupal.org/conference/sessions/batch-vs-queue-api-smackdown . Le code non forniscono feedback degli utenti e possono essere eseguite in parallelo.

Se hai bisogno del feedback degli utenti sei legato al batch, ma potresti anche usare la coda nel batch per provare a ottimizzarlo.


2

Come altri hanno già detto Drush è una buona soluzione, ma una coda è un ottimo strumento da usare. L'API batch in Drupal 7 utilizza l'API Queue core integrata, quindi se stai usando MySQL il tuo processo potrebbe essere strozzato. Ma l'API Queue di Drupal 7 è collegabile, quindi puoi usare un altro sistema di code come beanstalkd.


1

Se riesci a renderlo parallelo, è un buon inizio. Ecco alcuni dei miei pensieri su questo dato che ho usato 4 thread per eseguire la scansione di oltre un milione di pagine prima (tramite boost). Sto cercando di renderlo generalizzato ora. http://groups.drupal.org/node/126624

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.