2016-09-12 3 views
0

datastax cppドライバを使用して作成した単純なテーブルがあります。テーブルはcassandraデータベースに格納されています。表は次のように作成されます。datastax cppドライバを使用したcassandraデータベースの挿入時間を改善

create table data (
    dt_id int PRIMARY KEY, 
    dt_numbers list<int>, 
    insertion_time timestamp, 
) 

ので、行ごとに、私は、問題は、私は100万rowσを挿入しようとしましたが、時間は35分であったということです

VALUES (1, [1,2,3,4], now()) 

を挿入しています。その時間は、プロダクション環境では高いとみなされます。

いくつかの擬似コードは:

std::map<int, vector<int>> myData; 
for(all entries in myData) { 
    const char* query = "INSERT INTO..."; 
    future = cass_session_execute(session, statement); 
    cass_future_wait(future); 
} 

データは、STD ::マップに格納されており、私が最初に書かされるマップインデックス気にしませんが、すべてのマップエントリは、1つの挿入されなければなりません。このプログラムのパフォーマンスを向上させる方法はありますか?例はありますか?

私がこれまで使っていたコードは、他の後に1行を記述することであり、あなたが1行を書いているので、あなたはパフォーマンスの低下を取得しているdatastax例の1つ

CassError insert_into_basic(CassSession* session, const char* key, const Basic* basic) { 
     CassError rc = CASS_OK; 
     CassStatement* statement = NULL; 
     CassFuture* future = NULL; 
     const char* query = "INSERT INTO examples.basic (key, bln, flt, dbl, i32, i64) VALUES (?, ?, ?, ?, ?, ?);"; 

     statement = cass_statement_new(query, 6); 

     cass_statement_bind_string(statement, 0, key); 
     cass_statement_bind_bool(statement, 1, basic->bln); 
     cass_statement_bind_float(statement, 2, basic->flt); 
     cass_statement_bind_double(statement, 3, basic->dbl); 
     cass_statement_bind_int32(statement, 4, basic->i32); 
     cass_statement_bind_int64(statement, 5, basic->i64); 

     future = cass_session_execute(session, statement); 
     cass_future_wait(future); 

     rc = cass_future_error_code(future); 
     if (rc != CASS_OK) { 
     print_error(future); 
     } 

     cass_future_free(future); 
     cass_statement_free(statement); 

     return rc; 
    } 

答えて

0

で使用されるコードと類似しています時間とその単一の行が実際に書き込まれるのを待っています。ドキュメントを注意深く見れば、C *から最高のパフォーマンスを得るには、実際に非同期書き込みを実行する必要があることがわかります。擬似コードでは、次のようになります。

std::map<int, vector<int>> myData; 
std::list<CassFuture> futures; 
for(all entries in myData) { 
    const char* query = "INSERT INTO..."; 
    futures.push_back(cass_session_execute(session, statement)); 
    if (futures.size() > 5000) { 
    for (all entries in futures) { 
     cass_future_wait(future); 
     cass_future_free(future); 
    } 
    futures.clear(); 
    } 
} 
// Wait for the "trailing" futures... 
for (all entries in futures) { 
    cass_future_wait(future); 
    cass_future_free(future); 
} 

こうすれば、パフォーマンスが向上します。要件/ハードウェア仕様に合わせて調整する必要があります。5000もちろん、書き込みの失敗を処理するための戦略を実装します。

関連する問題