Cassandra: migliaia di record da inserire
-
21-12-2019 - |
Domanda
Sto usando Cassandra con Driver C ++ e ho osservato una prestazione molto lenta quando viene a inserire migliaia di righe.Sto usando un VM Ubuntu 12.04 LTS con 8GO RAM e 4CPUS.
Ho un file ASCII che contiene 15800 record e sto cercando di leggere ogni record e riempire il mio tavolo Cassandra DB con.Il comando "Copia" ha impiegato circa 1Min 30SEC.Con la direttiva dopo aver letto ogni record uno per uno ha preso circa 6-7 minuti e con una query batch richiede sempre (durato 30 minuti, poi ho abbandonato!).
Vorrei sapere se c'è una soluzione per un tale tipo di inserimento con prestazioni più veloci.
Molte grazie!
Soluzione 2
Sono riuscito a ridurre il lasso di tempo a 12.5 secondi affettando il lotto.Ecco la soluzione, se può aiutare gli altri e sarei felice se qualcun altro potrebbe fornire uno migliore:)
int nb_lines = 0;
int rest = 0;
string create_query = "BEGIN BATCH ";
std::ifstream file("/media/sf_Shared/xfmge");
for(string line; getline(file, line);){
stringstream sstm;
if(nb_lines == 800 ) {
nb_lines = 0;
rest = 0;
create_query += " APPLY BATCH;";
boost::shared_ptr<cql::cql_query_t> create(
new cql::cql_query_t(create_query, cql::CQL_CONSISTENCY_ONE));
query_result = session->query(create);
query_result.wait();
if (query_result.get().error.is_err()) {
cout << "-isbuild - ERROR for query: " << create_query << endl;
cout << query_result.get().error.message << endl;
return iserrno;
} else {
cout << "+isbuild - QUERY SUCCESSFUL: " << create_query << endl;
}
create_query = "BEGIN BATCH ";
} else {
record = (char*)line.c_str();
sstm << "insert into felder (id, data) values ('felder', '" << record << "') ";
create_query += sstm.str();
rest = 1;
}
nb_lines ++;
}
if(rest == 1){
create_query += " APPLY BATCH";
boost::shared_ptr<cql::cql_query_t> create(
new cql::cql_query_t(create_query, cql::CQL_CONSISTENCY_ONE));
query_result = session->query(create);
query_result.wait();
if (query_result.get().error.is_err()) {
cout << "-isbuild - ERROR for query: " << create_query << endl;
cout << query_result.get().error.message << endl;
return iserrno;
} else {
cout << "+isbuild - QUERY SUCCESSFUL: " << create_query << endl;
}
}
. Altri suggerimenti
Ecco il mio codice sorgente:
string create_query = "BEGIN BATCH ";
std::ifstream file("/media/sf_Shared/xfmge");
for(string line; getline(file, line);){
stringstream sstm;
record = (char*)line.c_str();
sstm << "insert into felder (id, data) values ('felder', '" << record << "') ";
create_query += sstm.str();
}
create_query += " APPLY BATCH;";
boost::shared_ptr<cql::cql_query_t> create(
new cql::cql_query_t(create_query, cql::CQL_CONSISTENCY_ONE));
query_result = session->query(create);
cout << "sending..." << endl;
query_result.wait();
if (query_result.get().error.is_err()) {
cout << "-isbuild - ERROR in query: " << create_query << endl;
cout << query_result.get().error.message << endl;
return iserrno;
} else {
cout << "+isbuild - QUERY SUCCESSFUL: " << create_query << endl;
}
.