Pregunta

Estoy usando Cassandra con el controlador C ++ y he observado un rendimiento muy lento al venir a insertar miles de filas.Estoy usando un VM Ubuntu 12.04 LTS con 8GO RAM y 4CPUS.

Tengo un archivo ASCII que contiene 15800 registros y estoy tratando de leer cada registro y llenar mi mesa Cassandra DB con.El comando "Copiar" tomó alrededor de 1min 30sec.Con la consulta después de leer cada registro, uno por uno tomó alrededor de 6-7mins y con una consulta por lotes que se necesita para siempre (duró 30 minutos, ¡luego abandoné!).

Me gustaría saber si hay alguna solución para ese tipo de inserción con un desempeño más rápido.

¡Muchas gracias!

¿Fue útil?

Solución 2

Me las arreglé para reducir el lapso de tiempo a 12.5 segundos al cortar el lote.Aquí está la solución, si puede ayudar a otros y sería feliz si alguien más podría proporcionar una mejor :)

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

}

Otros consejos

Aquí está mi código fuente:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top