Performance 卡桑德拉:需要插入数千条记录 我使用卡桑德拉和C++驱动程序,当我插入数千行时,我观察到了非常慢的性能。我使用的是带有8Go Ram和4CPU的VM Ubuntu 12.04 LTS
我有一个ascii文件,其中包含15800条记录,我正在尝试读取每条记录,并用它们填充我的cassandra db表。复制命令花费了大约1分钟30秒。一个接一个地读取每条记录后进行查询大约需要6-7分钟,而批量查询则需要持续30分钟,因此我放弃了 我想知道,对于这种插入,是否有任何性能更快的解决方案Performance 卡桑德拉:需要插入数千条记录 我使用卡桑德拉和C++驱动程序,当我插入数千行时,我观察到了非常慢的性能。我使用的是带有8Go Ram和4CPU的VM Ubuntu 12.04 LTS,performance,cassandra,cql3,nosql,Performance,Cassandra,Cql3,Nosql,我有一个ascii文件,其中包含15800条记录,我正在尝试读取每条记录,并用它们填充我的cassandra db表。复制命令花费了大约1分钟30秒。一个接一个地读取每条记录后进行查询大约需要6-7分钟,而批量查询则需要持续30分钟,因此我放弃了 我想知道,对于这种插入,是否有任何性能更快的解决方案 非常感谢 以下是我的源代码: string create_query = "BEGIN BATCH "; std::ifstream file("/media/sf_Shared/xfmge");
非常感谢 以下是我的源代码:
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;
}
我通过切片将时间间隔缩短到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;
}
}
这里没有足够的信息告诉你。首先,我要获得一些更详细的指标——整个流程中的单个指标并不能精确指出哪些活动是缓慢的。为每个活动安排一些时间,找出最大的贡献者是什么。您还需要共享一些代码,这样我们就可以看到是否有任何明显的错误,例如每次插入都有一个新的会话或准备好的语句。我使用sstableloader实用程序在几分钟内导入了大量数据,确实需要一些修改。你的Ubuntu虚拟机是否有用于交换的挂载点?在Cassandra Linux服务器上,应完全禁用交换。