我使用Cassandra和C ++驱动程序,并且在插入数千行时发现性能非常慢。我正在使用带有8Go Ram和4CPU的VM Ubuntu 12.04 LTS。
我有一个包含15800条记录的ascii文件,我试图读取每条记录并填充我的cassandra数据库表。 " COPY"命令花了大约1分30秒。在逐个阅读每条记录后进行查询需要大约6-7分钟,并且需要一次批量查询(持续30分钟然后我放弃了!)。
我想知道是否有任何解决方案可以提供更快的性能。
非常感谢!
答案 0 :(得分:0)
这是我的源代码:
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;
}
答案 1 :(得分:0)
我设法通过切片批次将时间间隔缩短到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;
}
}