foreach与数据库连接冻结,没有错误,永远

时间:2017-08-24 14:15:22

标签: r foreach parallel-processing doparallel

library(doParallel)
library(RMySQL)

no_cores <- as.integer(system('getconf _NPROCESSORS_ONLN', intern = TRUE)) - 1
cluster <- makeCluster(no_cores)
registerDoParallel(cl)

clusterEvalQ(
  cluster, 
  mysql <- RMySQL::dbConnect(...)
  }
)

r <- foreach(i = 1:50, .verbose = TRUE) %dopar% { dbGetQuery(mysql, 'show tables;')}

no variables are automatically exported

没有错误,没有抱怨。没什么,它只是冻结了。我可以启动并使用没有数据库连接的集群。

思考?

1 个答案:

答案 0 :(得分:3)

什么时候挂?在调用clusterEvalQ或foreach循环时?

我有一些建议:

  • 创建群集时使用outfile=""以获取调试输出;
  • 初始化群集时加载RMySQL;
  • NULL返回clusterEvalQ以避免序列化连接对象;
  • 请务必致电registerDoParallel,以便不在本地执行任务。

以下是使用这些建议的测试:

library(doParallel)
cl <- makePSOCKcluster(3, outfile="")
registerDoParallel(cl)

clusterEvalQ(cl, {
  library(RMySQL)
  mysql <- dbConnect(MySQL(), user='root',
                     password='notmypasswd', dbname='mysql')
  NULL
})

r <-
  foreach(i=1:50, .verbose=TRUE) %dopar% {
    dbGetQuery(mysql, 'show tables;')
  }

此测试适用于我。当我运行它时,我会看到以下消息:

no variables are automatically exported
numValues: 50, numResults: 0, stopped: TRUE
got results for task 1
numValues: 50, numResults: 1, stopped: TRUE
returning status FALSE
got results for task 2

如果你只看到:

no variables are automatically exported

然后它挂起,然后工作人员可能会尝试使用数据库连接执行查询。这对我来说听起来像MySQL问题,但我不是MySQL专家。