質問とサンプルコードに関するいくつかのポイント。
-
パイプラインは特効薬ではありません。使用する前に、パイプラインが何をするのかを理解する必要があります。パイプライン処理は、サーバーからの応答と同様に、バルクとして送信されるいくつかの操作をバッチ処理します。得られるのは、各操作のネットワークラウンドトリップ時間がバッチのネットワークラウンドトリップ時間に置き換えられることです。しかし、無限のサイズのバッチはリソースを実際に浪費します。効果を上げるには、バッチのサイズを十分に小さく保つ必要があります。経験則として、私は通常、パイプラインごとに60KBを目標にしようとしますが、すべてのデータが異なるため、パイプラインでの実際の操作の数も異なります。キーとその値が約1KBであると仮定すると、
pipeline.execute()
を呼び出す必要があります。 60回程度の操作ごと。 -
私がひどく誤解しない限り、このコードは実行されるべきではありません。
HMSET
を使用していますSET
のように 、したがって、基本的にハッシュのフィールド->値のマッピングが欠落しています。ハッシュ(HMSET
)および文字列(SET
)は異なるデータ型であるため、それに応じて使用する必要があります。 -
この1つの小さなループが「10億のデータ」全体を担当しているように見えます。その場合、辞書を保持するためのRAMがたくさんない限り、コードを実行しているサーバーが狂ったようにスワッピングするだけではありません。また、(Pythonの速度に関係なく)非常に効果がありません。このプロセスの複数のインスタンスを実行して、データ挿入を並列化する必要があります。
-
リモートでRedisに接続していますか?その場合、ネットワークがパフォーマンスを制限している可能性があります。
-
Redisの設定を検討してください。実際にボトルネックであると想定して、このタスクのパフォーマンスを向上させるために、これらを微調整/調整することができます。