具有数据库连接的 foreach 永远冻结,没有错误
foreach with database connection freezes with no error, forever
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
没有错误,没有抱怨。没什么,它只是冻结。我可以在没有数据库连接的情况下启动和使用集群。
想法?
什么时候挂?当调用 clusterEvalQ
或 foreach 循环时?
我有几点建议:
- 创建集群时使用
outfile=""
获取调试输出;
- 初始化集群时加载
RMySQL
;
- Return
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 专家。
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
没有错误,没有抱怨。没什么,它只是冻结。我可以在没有数据库连接的情况下启动和使用集群。
想法?
什么时候挂?当调用 clusterEvalQ
或 foreach 循环时?
我有几点建议:
- 创建集群时使用
outfile=""
获取调试输出; - 初始化集群时加载
RMySQL
; - Return
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 专家。