加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用rmongodb加速大型结果集处理

发布时间:2020-12-14 04:37:09 所属栏目:大数据 来源:网络整理
导读:我正在使用r mongodb来获取特定集合中的每个文档.它可以工作,但我正在使用数百万个小文档,可能是100M或更多.我正在使用网站上作者建议的方法:cnub.org/rmongodb.ashx count - mongo.count(mongo,ns,query)cursor - mongo.find(mongo,query)name - vector("c
我正在使用r mongodb来获取特定集合中的每个文档.它可以工作,但我正在使用数百万个小文档,可能是100M或更多.我正在使用网站上作者建议的方法:cnub.org/rmongodb.ashx

count <- mongo.count(mongo,ns,query)
cursor <- mongo.find(mongo,query)
name <- vector("character",count)
age <- vector("numeric",count)
i <- 1
while (mongo.cursor.next(cursor)) {
    b <- mongo.cursor.value(cursor)
    name[i] <- mongo.bson.value(b,"name")
    age[i] <- mongo.bson.value(b,"age")
    i <- i + 1
}
df <- as.data.frame(list(name=name,age=age))

这适用于数百或数千个结果但是循环非常非常慢.有什么方法可以加快速度吗?也许是多处理的机会?任何建议,将不胜感激.我平均每小时1M,按照这个速度,我只需要一周时间来构建数据框.

编辑:
我注意到while循环中的矢量越多,它就越慢.我现在正试图为每个向量分别循环.虽然看起来仍然像黑客,但必须有更好的方法.

编辑2:
我对data.table运气不错.它仍在运行,但看起来它将在4小时内完成12M(这是我目前的测试设置),这是进步但远非理想

dt <- data.table(uri=rep("NA",count),time=rep(0,action=rep("NA",bytes=rep(0,dur=rep(0,count))

while (mongo.cursor.next(cursor)) {
  b <- mongo.cursor.value(cursor)
  set(dt,i,1L,mongo.bson.value(b,"cache"))
  set(dt,2L,"path"))
  set(dt,3L,"time"))
  set(dt,4L,"bytes"))
  set(dt,5L,"elaps"))

}

解决方法

您可能想尝试mongo.find.exhaust选项

cursor <- mongo.find(mongo,query,options=[mongo.find.exhaust])

如果实际适用于您的用例,这将是最简单的修复.

然而,rmongodb驱动程序似乎缺少其他驱动程序可用的一些额外功能.例如,JavaScript驱动程序具有Cursor.toArray方法.这会直接将所有查找结果转储到数组中. R驱动程序有一个mongo.bson.to.list函数,但mongo.cursor.to.list可能就是你想要的.可能值得向驱动程序开发人员寻求建议.

一个hacky解决方案可能是创建一个新的集合,其文档是每个原始文档100000的数据“块”.然后使用mongo.bson.to.list可以有效地读取这些中的每一个.可以使用mongo服务器MapReduce功能构建分块集合.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读