Domanda

Sto usando Cassandra con Driver C ++ e ho osservato una prestazione molto lenta quando viene a inserire migliaia di righe.Sto usando un VM Ubuntu 12.04 LTS con 8GO RAM e 4CPUS.

Ho un file ASCII che contiene 15800 record e sto cercando di leggere ogni record e riempire il mio tavolo Cassandra DB con.Il comando "Copia" ha impiegato circa 1Min 30SEC.Con la direttiva dopo aver letto ogni record uno per uno ha preso circa 6-7 minuti e con una query batch richiede sempre (durato 30 minuti, poi ho abbandonato!).

Vorrei sapere se c'è una soluzione per un tale tipo di inserimento con prestazioni più veloci.

Molte grazie!

È stato utile?

Soluzione 2

Sono riuscito a ridurre il lasso di tempo a 12.5 secondi affettando il lotto.Ecco la soluzione, se può aiutare gli altri e sarei felice se qualcun altro potrebbe fornire uno migliore:)

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

}
.

Altri suggerimenti

Ecco il mio codice sorgente:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top