4

我尝试使用以下方法将数据从 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

绘制数据后,我相信:Import Time = f( Data^2 )

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

R^2 = 0.999997

  1. 我对么?
  2. 有更快的命令吗?

谢谢!

4

1 回答 1

3

lm很酷,但我认为如果您尝试添加功率 3、4、5、... 功能,您也会收到很棒的 R^2 =) 你过拟合了=)

已知的 R 的缺点之一是您不能有效地将元素附加到vector(或list)。附加元素触发整个对象的副本。在这里你可以看到这种效果的衍生物。一般来说,当您从 mongodb 获取数据时,您事先并不知道结果的大小。您遍历光标并增加结果列表。在旧版本中,由于上述 R 的行为,此过程非常缓慢。经过这样的拉动性能变得好多了。使用 s 的技巧有environment很大帮助,但它仍然不如预分配列表快。

但我们有可能做得更好吗?是的。

1)只需允许用户指向结果的大小并预分配列表。如果limit=传入mongo.find.all. 我为此增强功能填写了问题。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)
于 2015-08-12T08:48:44.100 回答