Beschleunigen Sie die Verarbeitung großer Ergebnismengen mit rmongodb

Ich benutze rmongodb, um jedes Dokument in einer bestimmten Sammlung abzurufen. Es funktioniert, aber ich arbeite mit Millionen kleiner Dokumente, möglicherweise 100 Millionen oder mehr. Ich verwende die vom Autor auf der Website vorgeschlagene Methode: 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))

Dies funktioniert gut für Hunderte oder Tausende von Ergebnissen, aber die while-Schleife ist SEHR SEHR langsam. Gibt es eine Möglichkeit, dies zu beschleunigen? Möglicherweise eine Gelegenheit für die Mehrfachverarbeitung? Anregungen wäre dankbar. Ich habe einen Durchschnitt von 1 Million pro Stunde und bei dieser Rate brauche ich eine Woche, um den Datenrahmen aufzubauen.

EDIT: Ich habe bemerkt, dass je mehr Vektoren in der while-Schleife, desto langsamer wird es. Ich versuche jetzt, für jeden Vektor separat zu schleifen. Trotzdem scheint es ein Hack zu sein, aber es muss einen besseren Weg geben.

Edit 2: Ich habe etwas Glück mit data.table. Es läuft noch, aber es sieht so aus, als würde es die 12M (das ist mein aktuelles Test-Set) in 4 Stunden beenden, das ist ein Fortschritt, aber alles andere als 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"))

}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage