具有数据库连接的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行中。