Como acelerar as operações da API do lote?

12

Eu me deparei com isso tanto com módulos de contribuição de terceiros quanto com algumas de minhas próprias operações. Estou curioso sobre as várias maneiras de acelerar minhas operações em lote / contrib ?

Suponha que eles trabalhem com nós (importação / atualização etc.) e estamos lidando com listas de análise de nós no intervalo de mais de 10.000 (embora eu tenha tido que lidar com 15 milhões de linhas .. o que sim - estou apenas ferrado. .)

É mais rápido anexar ao trabalho agupals cron.php e executar "headless"? Usando Drush? ou isso é simplesmente uma questão de como a análise rápida e eficiente posso desenvolver meu código e não influências externas ou dicas de otimização específicas de lotes ...

Atualmente, eu executei operações que (usando algum cálculo aproximado) podem levar mais de 24 horas ...

Obrigado!

electblake
fonte

Respostas:

9

Isso não funciona para o código contrib, mas se é o seu código e você o conhece bem, recomendo escrever um comando drush para fazer o trabalho. No drush, limite drupal_bootstrap () ao nível de bootstrap apropriado. Não consigo me lembrar dos números reais, mas uma porcentagem muito grande de tempo para cada solicitação drupal é gasta no bootstrap, e você pode economizar muito tempo lá.

Além disso, verifique as tripas do módulo Migrar. Eu não sei como é o seu mojo (nunca demorou para grocá-lo), mas ele pode explodir em lotes enormes de nós muito rapidamente.

na hora certa
fonte
Obrigado pela contribuição - Eu vou estar olhando para o módulo de migrar mais e que drupal_boostrap foi uma ótima dica bem;)
electblake
8

Toda chamada em lote é uma solicitação HTTP. Portanto, você precisa encontrar a combinação perfeita de quantas iterações pode processar antes que outra solicitação HTTP seja acionada. Duas coisas a considerar são memória e tempo máximo de execução. Você desejará processar o maior número possível de iterações por lote para reduzir o número de solicitações HTTP, pois elas provavelmente são as culpadas pelo seu lote lento.

Se o lote for muito pesado para ser executado com eficiência, você pode tentar usar uma fila. Há uma boa apresentação de lote x fila aqui http://sf2010.drupal.org/conference/sessions/batch-vs-queue-api-smackdown . As filas não fornecem feedback do usuário e podem ser executadas em paralelo.

Se você precisar de feedback do usuário, está vinculado ao lote, mas pode até usar a fila no lote para tentar otimizá-lo.

Jepedo
fonte
2

Como outros já disseram, o Drush é uma boa solução, mas uma fila é uma ótima ferramenta para usar. A API de lote no Drupal 7 usa a API de fila interna incorporada. Portanto, se você estiver usando o MySQL, seu processo poderá ter um gargalo. Porém, a API de fila do Drupal 7 é conectável, portanto você pode usar outro sistema de filas como beanstalkd.

bjeavons
fonte
1

Se você pode fazê-lo paralelo, é um bom começo. Aqui estão alguns dos meus pensamentos sobre isso, pois eu usei 4 threads para rastrear mais de um milhão de páginas antes (via impulso). Procurando torná-lo generalizado agora. http://groups.drupal.org/node/126624

mikeytown2
fonte