首页 文章

Cassandra:要插入数千条记录

提问于
浏览
1

我正在使用带有C驱动程序的Cassandra,并且在插入数千行时我发现性能非常慢 . 我正在使用VM Ubuntu 12.04 LTS与8Go Ram和4CPU .

我有一个包含15800条记录的ascii文件,我正在尝试读取每条记录并填充我的cassandra数据库表 . “COPY”命令大约需要1分30秒 . 在逐个阅读每条记录后进行查询需要大约6-7分钟,并且需要一次批量查询(持续30分钟然后我放弃了!) .

我想知道是否有任何解决方案,以更快的性能进行这种插入 .

非常感谢!

2 回答

  • 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;
    }
    
  • 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;
        }   
    
    }
    

相关问题