从R到MongoDB的并行插入

时间:2016-10-25 12:27:11

标签: r mongodb parallel-processing

问题

我使用包mongolite从R连接到MongoDB数据库。我想看看是否有可能在数据库中并行进行多次插入?虽然并行包中的mcmapply在其他情况下有效,但它似乎不能用于多次插入MongoDB。

示例代码

我有一个数据框grid.df,其中包含网格点和网格点的地理位置。我想将id_gridlonlat列插入数据库。

    insert.grid <- function(i){

           # check which data to insert            
            criteria <- sprintf('{"id_grid" : %s}', id_grid[i])

           # values to be inserted
            newdoc <- sprintf('{"$set" : {"id_grid" : %s, "loc" : {"type" : "Point", "coordinates" : [%s, %s] } }   }', 
                              grid.df$id_grid[i], 
                              round(grid.df$lon[i], digits = 4),
                              round(grid.df$lat[i], digits = 4)
            )
            inserted <- F
            while (!inserted) {
              inserted <- gcon$update(query = criteria, update = newdoc, upsert = T)
            }
          }

尝试

1)使用mcmapply

mcmapply适用于1核心。但是,只要我尝试使用多个内核,它就会失败。

results <- mcmapply(insert.grid, 1:nrow(grid.df), mc.cores = 4)

mc.preschedule参数设置为FALSE并没有帮助。

results <- mcmapply(insert.grid, 1:nrow(grid.df), mc.cores = 4, mc.preschedule = FALSE)

两者都给出以下错误:

  

警告消息:在mclapply中(seq_len(n),do_one,mc.preschedule =   mc.preschedule:所有计划的核心在用户中遇到错误   代码

2)使用文件锁

我也遵循了这里介绍的方法:http://www.quintuitive.com/2014/11/20/synchronization-for-r-with-the-flock-package/虽然它适用于多个内核,但我并没有真正获得很多性能,因为为每个插件制作锁会完全减慢进程并且它类似于使用1核心。

1 个答案:

答案 0 :(得分:1)

通过移动函数定义中的gcon连接解决了这个问题。问题很简单,只定义了一个连接,并不能用于并行插入。