acelerar o processamento de conjunto de resultados grande usando o rmongodb
Eu estou usando o rmongodb para obter todos os documentos em uma coleção particular. Funciona, mas estou trabalhando com milhões de pequenos documentos, potencialmente 100M ou mais. Estou usando o método sugerido pelo autor no site: cnub.org/rmongodb.ashx
count <- mongo.count(mongo, ns, query)
cursor <- mongo.find(mongo, query)
name <- vector("character", count)
age <- vector("numeric", count)
i <- 1
while (mongo.cursor.next(cursor)) {
b <- mongo.cursor.value(cursor)
name[i] <- mongo.bson.value(b, "name")
age[i] <- mongo.bson.value(b, "age")
i <- i + 1
}
df <- as.data.frame(list(name=name, age=age))
Isso funciona bem para centenas ou milhares de resultados, mas o loop while é MUITO MUITO lento. Existe alguma maneira de acelerar isso? Talvez uma oportunidade para multiprocessamento? Qualquer sugestão seria apreciada. Tenho uma média de 1 milhão por hora e, nesse ritmo, precisarei de uma semana apenas para criar o quadro de dados.
EDIT: Eu notei que quanto mais vetores no loop while o mais lento fica. Agora estou tentando fazer um loop separadamente para cada vetor. Ainda parece um truque, deve haver uma maneira melhor.
Edit 2: Estou tendo alguma sorte com o data.table. Ainda está funcionando, mas parece que vai terminar o 12M (este é o meu conjunto de testes atual) em 4 horas, isso é progresso, mas longe do ideal
dt <- data.table(uri=rep("NA",count),
time=rep(0,count),
action=rep("NA",count),
bytes=rep(0,count),
dur=rep(0,count))
while (mongo.cursor.next(cursor)) {
b <- mongo.cursor.value(cursor)
set(dt, i, 1L, mongo.bson.value(b, "cache"))
set(dt, i, 2L, mongo.bson.value(b, "path"))
set(dt, i, 3L, mongo.bson.value(b, "time"))
set(dt, i, 4L, mongo.bson.value(b, "bytes"))
set(dt, i, 5L, mongo.bson.value(b, "elaps"))
}