gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:28:43 25 4
gpt4 key购买 nike

我正在使用 rmongodb 来获取特定集合中的每个文档。它可以工作,但我正在处理数百万个小文档,可能是 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))

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

编辑:我注意到while循环中的向量越多,它变得越慢。我现在尝试为每个向量分别循环。虽然看起来仍然像一个 hack,但一定有更好的方法。

编辑 2:我对 data.table 有一些运气。它仍在运行,但看起来它将在 4 小时内完成 12M(这是我当前的测试集),这是一个进步,但远非理想

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"))

}

最佳答案

您可能想尝试 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 个数据“ block ”。然后这些中的每一个都可以用 mongo.bson.to.list 有效地读取。可以使用 mongo 服务器 MapReduce 功能构建分 block 集合。

关于r - 使用 rmongodb 加速大型结果集处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13965261/

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