ускорить обработку большого результирующего набора с помощью rmongodb
Я использую rmongodb, чтобы получить каждый документ в определенной коллекции. Это работает, но я работаю с миллионами небольших документов, потенциально 100 миллионов и более. Я использую метод, предложенный автором на сайте: 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))
Это прекрасно работает для сотен или тысяч результатов, но цикл while ОЧЕНЬ ОЧЕНЬ медленный. Есть ли способ ускорить это? Может быть, возможность многопроцессорной обработки? Мы ценим любые предложения. Я в среднем 1М в час, и для этого мне понадобится неделя, чтобы построить фрейм данных.
РЕДАКТИРОВАТЬ: я заметил, что чем больше векторов в цикле while, тем медленнее он становится. Я сейчас пытаюсь зациклить отдельно для каждого вектора. Тем не менее, похоже, что взломать, должен быть лучший способ.
Редактировать 2: мне повезло с data.table. Он все еще работает, но похоже, что он закончит 12M (это мой текущий набор тестов) через 4 часа, это прогресс, но далеко не идеальный
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"))
}