web-dev-qa-db-ja.com

バッチAPIオペレーションをスピードアップする方法は?

私は、サードパーティのcontribモジュールと自分自身の操作の両方でこれに遭遇しました。私/投稿をスピードアップするさまざまな方法に興味があります バッチ操作

それらがノード(インポート/更新など)で動作し、10,000以上の範囲のノードのリストの解析を処理していると想定します(ただし、1500万行を処理する必要がありましたが、そうです。 。)

Drupalsのcron.phpジョブに接続して「ヘッドレス」で実行する方が速いですか? Drushを使用していますか?または、これは単にコードを開発する効率と迅速な解析の問題であり、no外部の影響またはバッチ固有の最適化のヒントがあります...

現在、私は(大まかな計算を使用して)could 24時間以上かかる操作に遭遇しています...

ありがとう!

12
electblake

これはcontribコードでは機能しませんが、それがあなたのコードでよくわかっている場合は、drushコマンドを作成して作業を行うことをお勧めします。 Drush内で、 drupal_bootstrap ()を適切なbootstrapレベルに制限します。実際の数値を思い出すことはできませんが、drupalリクエストはブートストラップに費やされるため、そこで時間を大幅に節約できます。

さらに、移行モジュールの要点を確認してください。それがどのようにしてモジョなのかはわかりませんが(時間をかけずに理解することはありません)、膨大な数のノードのバッチを非常にすばやく突破できます。

9
justintime

すべてのバッチ呼び出しはHTTPリクエストです。したがって、別のHTTPリクエストが発生する前に処理できる反復の数の完璧なブレンドを見つける必要があります。考慮すべき2つのことは、メモリと最大実行時間です。遅いバッチの原因である可能性が最も高いHTTPリクエストの数を減らすには、バッチごとにできるだけ多くの反復を処理する必要があります。

バッチが重すぎて効率的に実行できない場合は、代わりにキューを使用してみてください。ここにバッチ対キューの優れたプレゼンテーションがあります http://sf2010.drupal.org/conference/sessions/batch-vs-queue-api-smackdown 。キューはユーザーフィードバックを提供せず、並行して実行できます。

ユーザーフィードバックが必要な場合は、バッチに関連付けられていますが、バッチでキューを使用して最適化を試みることもできます。

8
Jepedo

Drushは優れたソリューションですが、キューは優れたツールです。 Drupal 7のバッチAPIは組み込みコアQueue APIを使用するため、MySQLを使用している場合、プロセスがそこでボトルネックになる可能性があります。しかし、Drupal 7のキューAPIはプラグイン可能であるため、beanstalkdなどの別のキューシステムを使用できます。

2
bjeavons

あなたがそれを平行にすることができるならば、それは良いスタートです。これまでに(ブーストを介して)4つのスレッドを使用して100万以上のページをクロールしたことがあるので、これについての私の考えの一部を示します。今それを一般化しようとしています。 http://groups.drupal.org/node/126624

1
mikeytown2