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