【问题标题】:long time to import data using mongo.find.all (rmongodb)长时间使用 mongo.find.all (rmongodb) 导入数据
【发布时间】:2015-08-06 09:16:07
【问题描述】:

我尝试使用以下方法将数据从 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. 有更快的命令吗?

谢谢!

【问题讨论】:

    标签: r mongodb rmongodb


    【解决方案1】:

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

    【讨论】:

    • 谢谢德米特里!在大多数情况下,我想提取集合中的所有文档,以便知道结果的大小(使用“mongo.count”)。但我不明白什么是:光标
    • 查看更新的代码。 mapply 无济于事,因为您必须遍历游标。如果你不明白它是如何工作的,请参阅 MongoDB 手册:docs.mongodb.org/manual/core/cursors
    • while 循环中不应该是result_lst[[i]] 吗?
    猜你喜欢
    • 2017-09-23
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2022-07-28
    • 1970-01-01
    相关资源
    最近更新 更多