gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:13:35 25 4
gpt4 key购买 nike

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

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

R^2 = 0.999997

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

谢谢!

最佳答案

lm 很酷,但我认为如果您尝试添加 power 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)

关于r - 长时间使用 mongo.find.all (rmongodb) 导入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31851640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com