使用rmongodb加快大的结果集处理(speed up large result set proc

2019-08-04 09:13发布

我使用rmongodb获得AA特定集合中的每个文件。 它的工作原理,但我与数以百万计的小文件,可能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。 它仍在运行,但它看起来将完成12M(这是我目前的测试集)在4小时内,这是进步,但很不理想

dt <- data.table(uri=rep("NA",count),
                 time=rep(0,count),
                 action=rep("NA",count),
                 bytes=rep(0,count),
                 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, i, 2L,  mongo.bson.value(b, "path"))
  set(dt, i, 3L,  mongo.bson.value(b, "time"))
  set(dt, i, 4L,  mongo.bson.value(b, "bytes"))
  set(dt, i, 5L,  mongo.bson.value(b, "elaps"))

}

Answer 1:

你可能会想尝试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可能是你想要的东西。 这可能是值得查验咨询的驱动程序开发人员。

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



Answer 2:

我知道没有更快的方式以一般的方式来做到这一点。 您是从国外进口的应用数据和解释型语言工作,有办法rmongodb没有可以预见的集合中的文档的结构。 这个过程是天生就慢,当你正在处理数以千计的文件。



文章来源: speed up large result set processing using rmongodb