首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:使用rmongodb加快数据导入速度

R:使用rmongodb加快数据导入速度
EN

Stack Overflow用户
提问于 2016-04-02 10:01:42
回答 1查看 1.5K关注 0票数 1

考虑一个Mongo数据库,其中每个条目都具有以下数据结构。

代码语言:javascript
复制
{
    "_id" : ObjectId("numbersandletters"),
    "hello" : 0,
    "this" : "AUTO",
    "is" : "34.324.25.53",
    "an" : "7046934",
    "example" : 0,
    "data" : {
        "google" : "SEARCH",
        "wikipedia" : "Placeholder",
        "twitch" : "2016",
        "twitter" : "More_placeholder",
        "facebook" : "Run out of ideas",
        "stackoverflow" : "is great",
    },
    "schema" : "",
    "that" : "",
    "illustrates" : 0,
    "the_point" : "/somethinghere.html",
    "timestamp" : ISODate("2016-03-05T04:53:20.000Z")
}

上述数据结构是单个数据观测的一个例子。数据库中大约有1 200万次观测。数据结构中的字段"this“可以具有”自动“或”手动“的属性。

目前,我正在使用rmongodb库将Mongo中的一些数据导入R中,然后将结果列表转换为数据框架。

R代码如下:

代码语言:javascript
复制
library(rmongodb)

m <- mongo.create(host = "localhost", db = "example")

rawData <- mongo.find.all(m, "example.request", query = list(this = "AUTO"), 
                           fields = list(hello = 1L, is = 1L, an = 1L, data.facebook = 1L, the_point = 1L))

rawData <- data.frame(matrix(unlist(rawData), nrow = length(rawData), byrow = TRUE))

上面的代码适用于相对较小的数据集(例如,<100万次观测),但对于1200万次数据集来说则是缓慢的。

是否有一种更聪明(因而更快)的方法从Mongo导入数据,然后将结果数据投影到R数据帧中?

干杯。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-22 21:38:16

请看一下蒙高岭石包。你应该在几百万的结果中得到一些速度的提升。

代码语言:javascript
复制
library(mongolite)
mongo <- mongo(collection = "request", db = "example", url = "mongodb://localhost") 

df <- mongo$find(query = '{ "this" : "AUTO" }', fields = '{ "_id" : 0, "hello" : 1, "is" : 1, "an" : 1, "data.facebook" : 1, "the_point" : 1 }')

但是,随着结果集的增长,转换为data.frame的过程会减慢。

出于这个原因,我一直在尝试加快mongolite的速度,方法是删除递归调用,尝试并平缓查询中的JSON结构,并依赖data.tablerbindlist游标(以避免将其转换为data.frame的mongolite::simplify函数)。这将返回一个data.table对象

这个蒙哥利特包仍在开发中,您发送的任何查询都必须能够通过rbindlist强制进入data.table。在pacakge主页上,我添加了一些基准来显示速度。

代码语言:javascript
复制
## install the package with
library(devtools)
install_github("SymbolixAU/mongolitedt")

library(mongolitedt)
## requires data.table and mongolite

# rm(mongo); gc()
mongo <- mongo(collection = "request", db = "example", url = "mongodb://localhost") 
bind_mongolitedt(mongo)   ## bind dt functions to mongolite connection object


dt <- mongo$finddt(query = '{ "this" : "AUTO" }', fields = '{ "_id" : 0, "hello" : 1, "is" : 1, "an" : 1, "data.facebook" : 1, "the_point" : 1 }')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36371833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档