문제

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top