具有数据库连接的foreach将永久冻结,不会出错 库(双并行) 图书馆(RMySQL) 无核
什么时候挂?调用具有数据库连接的foreach将永久冻结,不会出错 库(双并行) 图书馆(RMySQL) 无核,r,foreach,parallel-processing,doparallel,R,Foreach,Parallel Processing,Doparallel,什么时候挂?调用clusterEvalQ或foreach循环时 我有几点建议: library(doParallel) library(RMySQL) no_cores <- as.integer(system('getconf _NPROCESSORS_ONLN', intern = TRUE)) - 1 cluster <- makeCluster(no_cores) registerDoParallel(cl) clusterEvalQ( cluster, mys
clusterEvalQ
或foreach循环时
我有几点建议:
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
- 创建集群时使用
获取调试输出李>outfile=“
- 初始化集群时加载
李>RMySQL
- 从
返回clusterEvalQ
,以避免序列化连接对象李>NULL
- 确保调用
,使任务不会在本地执行registerDoParallel
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
如果你只看到:
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
然后它挂起,然后工作人员可能挂起试图使用数据库连接执行查询。这听起来像是MySQL的问题,但我不是MySQL专家。什么时候挂起?调用
clusterEvalQ
或foreach循环时
我有几点建议:
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
- 创建集群时使用
获取调试输出李>outfile=“
- 初始化集群时加载
李>RMySQL
- 从
返回clusterEvalQ
,以避免序列化连接对象李>NULL
- 确保调用
,使任务不会在本地执行registerDoParallel
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
如果你只看到:
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
然后它挂起,然后工作人员可能挂起试图使用数据库连接执行查询。这听起来像是MySQL的问题,但我不是MySQL专家。谢谢史蒂夫,这绝对是最后一部分。我什么也没得到,只是挂起了,所以可能是数据库连接失败了。我只是希望有一些输出。我离开了它大约20分钟,它仍然在那里,只是卡住了,没有错误信息或其他任何东西。我还忽略了在我的示例中添加
registerDoParallel
,但这是在我的实际示例中。我会试试你的建议,如果其中有任何一个奏效的话,我会告诉你的。感谢您的关注!您是否可以对“避免序列化连接对象”的含义进行一点扩展?@BrandonBertelsen在我的示例中,如果调用clusterEvalQ
时未包含NULL
,它将尝试返回由worker创建的连接对象列表。由于数据库连接对象包含套接字连接,这将导致序列化错误。我不认为这会造成任何真正的问题,但这是令人不安的。对于路人来说,我遵循@SteveWeston的建议,按照规定添加了空值,还将doParallel添加到我的包的depens行。谢谢Steve,这肯定是最后一部分。我什么也没得到,只是挂起了,所以可能是数据库连接失败了。我只是希望有一些输出。我离开了它大约20分钟,它仍然在那里,只是卡住了,没有错误信息或其他任何东西。我还忽略了在我的示例中添加registerDoParallel
,但这是在我的实际示例中。我会试试你的建议,如果其中有任何一个奏效的话,我会告诉你的。感谢您的关注!您是否可以对“避免序列化连接对象”的含义进行一点扩展?@BrandonBertelsen在我的示例中,如果调用clusterEvalQ
时未包含NULL
,它将尝试返回由worker创建的连接对象列表。由于数据库连接对象包含套接字连接,这将导致序列化错误。我不认为这会造成任何真正的问题,但这是令人不安的。对于路人来说,我遵循@SteveWeston的建议,按照规定添加了NULL,并将doParallel添加到我的包的depens行中。