2016-09-12 3 views
0

У меня есть простая таблица, которую я заполняю с помощью драйвера datastax cpp. Таблица хранится в базе данных cassandra. Таблица создается следующим образом:улучшить время вставки в базу данных cassandra с помощью драйвера datastax cpp

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

Таким образом, для каждой строки я вставив

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

Проблема заключается в том, что я попытался вставить 1 миллион rowσ и время было 35 минут. Это время считается высоким в производственной среде.

Некоторые псевдокод:

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); 
} 

Данные сохраняются в станд :: карте, и я не забочусь, отображающих индекс будет записан первым, но каждая запись карта должна быть вставлена ​​точно один. Есть ли способ повысить производительность этой программы? Есть ли пример?

код я использую до сих пор, чтобы написать одну строку за другой и схожа с кодом, используемым в одном из примеров datastax

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 в соответствии с вашими требованиями/спецификациями оборудования. И, конечно же, реализовать некоторую стратегию для обработки ошибок записи.