Cassandra:挿入する何千ものレコード
-
21-12-2019 - |
質問
CassandraをC ++ドライバで使用しています、そして私は何千の行を挿入するようになると非常に遅いパフォーマンスを観察しました。私は8Go RAMと4cpusでVM Ubuntu 12.04 LTSを使用しています。
私は15800のレコードを含むASCIIファイルを持っています、そして私は各レコードを読み、私のCassandra dbテーブルを記入しようとしています。「コピー」コマンドは約1分30秒かかりました。各レコードを1つずつ読んだ後のクエリでは、1つずつ約6-7分かけてバッチクエリが必要な場合は永遠に必要となります(30分後に放棄されました。)。
パフォーマンスが速いような挿入のための解決策があるかどうかを知りたいのですが。
多くの感謝!
解決 2
私はバッチをスライスすることによって時間の経過を12.5秒に減らすことを管理しました。これが他の人を助けることができれば、他の人がより良いものを提供することができれば幸せになる解決策です:)
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;
}
}
. 他のヒント
これは私のソースコードです:
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;
}
. 所属していません StackOverflow