我正在使用rmongodb获取特定集合中的每个文档。它有效,但我正在处理数百万个小文件,可能有100M或更多。我使用的是由作者在网站上提出的方法:cnub.org/rmongodb.ashx使用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))
这工作得很好成百上千的结果,但是,虽然环是非常非常慢。有什么方法可以加快速度吗?也许是多处理的机会?任何建议,将不胜感激。我每小时的平均值为1M,按照这个速度,我只需要一个星期来构建数据框。
编辑: 我注意到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"))
}
我不是r程序员,事实上我从来没有使用过它,但是为什么你不选择你需要的数据的子集,而不是迭代整个集合,然后执行所需的验证?在这种情况下,发送像6个游标服务器端而不是仅仅一个会更容易。 – Sammaye
咦?当然,while循环中的矢量越多,它越慢。还有更多的事情要做。所以需要更长的时间。或者它是非线性的?它是如何表现你正在循环的事物数量的不同值?或者,“更多媒介”是否意味着更多的东西,如年龄和名字?不清楚。 – Spacedman
@Sammaye,这正是我的意思是分别为每个向量循环。我昨晚试了一次,在这个循环中放了一个计数器,它似乎刚刚死亡,几个小时后停止打印。 rsession只是挂起。所以这种方法没有帮助。 – rjb101