问题
我使用包mongolite从R连接到MongoDB数据库。我想看看是否有可能在数据库中并行进行多次插入?虽然并行包中的mcmapply
在其他情况下有效,但它似乎不能用于多次插入MongoDB。
示例代码
我有一个数据框grid.df
,其中包含网格点和网格点的地理位置。我想将id_grid
,lon
和lat
列插入数据库。
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核心。
答案 0 :(得分:1)
通过移动函数定义中的gcon
连接解决了这个问题。问题很简单,只定义了一个连接,并不能用于并行插入。