使用mongo.find.all(rmongodb)导入数据的时间很长

时间:2015-08-06 09:16:07

标签: r mongodb rmongodb

我尝试使用以下方法将数据从mongodb导入到r:

mongo.find.all(mongo, namespace, query=query,
fields= list('_id'= 0, 'entityEventName'= 1, context= 1, 'startTime'=1 ), data.frame= T)

该命令可以查找小数据集,但我想导入1,000,000个文档。

使用system.time并在命令中添加limit = X,我将时间测量为要导入的数据的函数:

system.time(mongo.find.all(mongo, namespace, query=query ,
fields= list('_id'= 0, 'entityEventName'= 1, context= 1, 'startTime'=1 ),
limit= 10000, data.frame= T))

结果:

Data Size   Time
1           0.02
100         0.29
1000        2.51
5000        16.47
10000       20.41
50000       193.36
100000      743.74
200000      2828.33

在绘制数据后我相信: 导入时间= f(数据^ 2

时间= -138.3643 + 0.0067807 *数据大小+ 6.773e-8 *(数据大小-45762.6)^ 2

R ^ 2 = 0.999997

  1. 我说错了吗?
  2. 是否有更快的命令?
  3. 谢谢!

1 个答案:

答案 0 :(得分:3)

lm很酷,但我想如果你试图增加力量3,4,5,...功能,你也会收到很棒的R ^ 2 =)你过度适应=)

R的一个已知缺点是,您无法有效地将元素附加到vector(或list)。追加元素触发整个对象的副本。在这里你可以看到这种效果的衍生。 通常,当您从mongodb获取数据时,您事先并不知道结果的大小。您迭代游标并增长结果列表。在旧版本中,由于上述R的行为,这个过程非常慢。 this pull表现变得更好。 使用environment的技巧有很大帮助,但它仍然没有预分配列表那么快。

但我们可以做得更好吗?是。

1)只需允许用户指定结果的大小并预分配列表。如果将limit=传递到mongo.find.all,则会自动执行此操作。我filled issue用于此增强功能。
2)在C代码中构造结果。

如果事先知道您的数据大小,您可以:

cursor <- mongo.find(mongo, namespace, query=query, fields= list('_id'= 0, 'entityEventName'= 1, context= 1, 'startTime'=1 ))
result_lst <- vector('list', NUMBER_OF_RECORDS)
i <- 1
while (mongo.cursor.next(cursor)) {
  result_lst[[i]] <- mongo.bson.to.list(mongo.cursor.value(cursor))
  i <- i + 1
}
result_dt <- data.table::rbindlist(result_lst)