我试图使用以下命令将数据从MongoDB导入R:

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

该命令适用于小型数据集find,但我想导入1000000个文档。
使用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
我说的对吗?
有更快的命令吗?
谢谢!

最佳答案

lm很酷,但我想如果你想增加3,4,5的能量,…功能,您还将收到很棒的r^2=)您过适合=)
已知r的缺点之一是不能有效地将元素附加到vector(或list)。追加元素将触发整个对象的副本。在这里你可以看到这个效应的导数。
一般来说,当您从MongoDB获取数据时,您不会预先知道结果的大小。遍历游标并增大结果列表。在较旧的版本中,由于上述r的行为,这个过程非常缓慢。在this pull之后,性能变得更好。
使用environments的技巧有很大帮助,但仍然不如预先分配的列表快。
但我们能做得更好吗?对。
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)

08-25 19:06
查看更多