使用rmongodb加速大型结果集处理
我正在使用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,按照这个速度,我只需要一周时间来构建数据框. 编辑: 编辑2: 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功能构建分块集合. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |