Ich benutze rmongodb, um jedes Dokument in einer bestimmten Sammlung zu bekommen. Es funktioniert, aber ich arbeite mit Millionen kleiner Dokumente, möglicherweise 100 Millionen oder mehr. Ich bin mit der vom Autor auf der Website vorgeschlagene Methode: cnub.org/rmongodb.ashxbeschleunigen große Ergebnismenge Verarbeitung mit rmongodb
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 sehr, sehr langsam. Gibt es eine Möglichkeit, dies zu beschleunigen? Vielleicht eine Chance für Multiprocessing? Irgendwelche Vorschläge würden geschätzt werden. Ich bin durchschnittlich 1M pro Stunde und bei dieser Rate brauche ich nur eine Woche, um den Datenrahmen aufzubauen.
EDIT: Ich habe festgestellt, dass je mehr Vektoren in der While-Schleife, desto langsamer wird es. Ich versuche jetzt, für jeden Vektor getrennt zu loopen. Sieht immer noch wie ein Hack aus, es muss einen besseren Weg geben.
Edit 2: Ich habe etwas Glück mit data.table. Es ist immer noch läuft, aber es sieht aus wie es die 12M beenden wird (dies ist mein aktuelles Test-Set ist) in 4 Stunden, das ist Fortschritt, aber bei weitem nicht 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"))
}
Ich bin kein Programmierer, tatsächlich habe ich es nie benutzt, aber warum nicht die Teilmengen der Daten heraussuchen, die Sie brauchen, anstatt nur über die gesamte Sammlung zu iterieren und dann die erforderliche Validierung durchzuführen? In diesem Fall wäre es einfacher, 6 Server anstelle von nur einem Server zu senden. – Sammaye
Huh? Natürlich, je mehr Vektoren in der While-Schleife, desto langsamer wird es. Es gibt noch mehr zu tun. Also dauert es länger. Oder ist es nicht linear? Wie verhält es sich mit verschiedenen Werten der Anzahl von Dingen, die Sie durchlaufen? Oder mit "mehr Vektoren" meinst du mehr Dinge wie Alter und Name? Unklar. – Spacedman
@Sammaye, das ist genau das, was ich meinte, indem ich für jeden Vektor getrennt loopte. Ich habe es letzte Nacht ausprobiert, einen Zähler in diese Schleife gelegt und es scheint gerade gestorben zu sein, nach einigen Stunden hat es aufgehört zu drucken. Die Idee ist einfach aufgehängt. Also diese Methode hat nicht geholfen. – rjb101