Cassandra : 삽입 할 수천 가지 기록
-
21-12-2019 - |
문제
C ++ 드라이버로 Cassandra를 사용하고 있으며 수천 개의 행을 삽입 할 때 매우 느린 성능을 관찰했습니다.8Go RAM과 4CPU가있는 VM Ubuntu 12.04 LTS를 사용하고 있습니다.
I 15800 레코드가 포함 된 ASCII 파일이 있고 각 레코드를 읽고 카세일드라 DB 테이블을 채우려고합니다."copy"명령은 약 1 분 30 초가 걸렸습니다.각 레코드를 읽은 후에 쿼리가 6-7 분 정도 소요되며 일괄 쿼리가 필요합니다 (30 분 동안 나는 포기한 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