2017-06-05 19 views
2

python Cassandraドライバを使用して、複数のエントリをCassandraのテーブルに挿入して更新しています。現在、私のコードは次のようになります。python cassandraドライバを使用してcassandraに最も速く挿入する方法

cluster = Cluster() 
session = cluster.connect('db') 
for a in list: 
    if bool: 
     # calculate b 
     session.execute("UPDATE table SET col2 = %s WHERE col1 = %s", (b, a)) 
    else: 
     # calculate b 
     session.execute("INSERT INTO table(col1, col2) VALUES(%s, %s)", (a, b)) 

挿入されるリストのエントリ数は、(すべてがユニークである)非常に大きいとして挿入および更新するこの方法は非常に遅いです。これを行うより速い方法がありますか?

+1

使用 ' Session.execute_async'メソッドを準備するdステートメント –

+0

'bool'はどこから来ますか?それはあなたのオブジェクトのために使用しないでください、組み込みクラス名です –

+0

@AzatIbrakovはexecute_async()順番にクエリを実行しますか?そうであれば、execute_async()を使用して多くのクエリを実行し、session.execute_async()の最後の呼び出しで返されたResponseFutureオブジェクトに対してresult()を呼び出すことができます。いいえの場合は、すべてのクエリが実行されたことを確認するために何をすべきですか(つまり、すべての挿入が完了しています)。 –

答えて

0

一般的にこのシナリオでは、Cassandraへの同時書き込み数を増やすことで最高のパフォーマンスが得られます。

あなたはあなたの説明からexecute_concurrent

を使用してDatastaxのPythonカサンドラドライバでこれを行うことができ、それはあなたのケースのためのカサンドラとUpdateInsert差がないことは注目に値します。 (つまり、あなたは、単に(A、B)。

あなたはプリペアドステートメントを作成することになるでしょうが、すべての値のためのあなたのelse節からのINSERT文を行うことができます。

よりもむしろで一度に挿入いずれかの操作を実行しますあなたのループのために、execute_concurrentの入力として(a、b)はペアの事前計算グループを検討し、あなたもexecute_concurrentのための入力として、発電機や発電機の式を書くことができます

例:。

parameters = ((a, calculate_b(a)) for a in my_list) 
execute_concurrent_with_args(my_session, my_prepared_statement, parameters) 
関連する問題