Question

J'utilise Cassandra avec un pilote C ++ et j'ai observé une performance très lente lorsque vous venez insérer des milliers de lignes.J'utilise un VM Ubuntu 12.04 LTS avec RAM 8Go et 4CPUS.

J'ai un fichier ASCII qui contient 15800 enregistrements et j'essaie de lire chaque enregistrement et de remplir ma table de DB Cassandra avec.La commande "copie" a pris environ 1min 30Sec.Avec interrogation après avoir lu chaque record, une par une a pris environ 6-7 minutes et avec une requête de lot, elle prend pour toujours (30 minutes dure alors j'ai abandonné!).

J'aimerais savoir s'il existe une solution pour un tel type d'insertion avec une performance plus rapide.

Merci beaucoup!

Était-ce utile?

La solution 2

J'ai réussi à réduire le temps écoulé à 12,5 secondes en tranchant le lot.Voici la solution, si cela peut aider les autres et je serais heureux que quelqu'un d'autre puisse en fournir un meilleur :)

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

}

Autres conseils

Voici mon code source:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top