标签: doparallel

优化 R 中的嵌套 foreach dopar

我想就我的以下代码的结构提供输入。想知道是否需要以不同的方式组织它以更快地执行。具体来说,我是否需要在嵌套循环中以不同的方式使用foreachdopar。目前,内部循环是大部分工作(ddply 有 1-8 个细分变量,每个变量有 10-200 个级别),这就是我并行运行的内容。为简单起见,我省略了代码细节。

有任何想法吗?我的代码(如下组织的)确实有效,但在 6 核 41gb 机器上需要几个小时。数据集不是那么大(< 20k 记录)。

for(m in 1:length(Predictors)){  # has up to three elements in the vector

  # construct the dataframe based on the specified predictor
  # subset the original dataframe based on the breakdown variables, outcome, predictor and covariates

  for(l in 1:nrow(pairwisematrixReduced)){  # this has 1-6 rows;subset based on correct comparison groups

    # some code here

    cl <- makeCluster(detectCores())  
    registerDoParallel(cl) 

    for (i in 1:nrow(subsetting_table)){  # this table …
Run Code Online (Sandbox Code Playgroud)

foreach r plyr doparallel

2
推荐指数
1
解决办法
1507
查看次数

foreach、doParallel 和随机生成

考虑使用并行foreach生成随机值的非常基本(且效率低下)的代码:

cl <- makeCluster(2)
registerDoParallel(cl)
foreach(i = 1:100) %dopar% rnorm(1)
Run Code Online (Sandbox Code Playgroud)

它是正确的还是随机生成正常工作需要任何额外的步骤?我想这已经足够了,快速检查似乎“证明”了种子工作正常,但我想确定它在其他平台上也是如此,因为我希望代码是可移植的。

parallel-processing r parallel-foreach doparallel

2
推荐指数
1
解决办法
628
查看次数

如何将许多变量和函数从全局环境导出到foreach循环?

如何在foreach中为每个并行模拟的开始导出全局环境?以下代码是调用以运行模拟的函数的一部分.

  num.cores <- detectCores()-1
  cluztrr <- makeCluster(num.cores)
  registerDoParallel(cl = cluztrr)

  sim.result.list <- foreach(r = 1:simulations, 
      .combine = list,
      .multicombine = TRUE, 
      ) %dopar% {

          #...tons of calculations using many variables...

          list(vals1,
               vals2,
               vals3)
  }
 stopCluster(cluztrr)
Run Code Online (Sandbox Code Playgroud)

是否有必要使用.export与我使用的每个变量和函数的字符向量?执行时间会慢吗?

parallel-processing foreach r global-variables doparallel

2
推荐指数
2
解决办法
2234
查看次数

为什么在 foreach 中使用 %dopar% 会导致 R 无法识别包?

我试图通过使用 doParallel 包和 foreach 包来让我的代码在 R 上并行运行。我还使用 sf 包来操作 shp 文件。我确保所有代码都在 foreach 循环中使用 %do% 工作,因此如果出现错误,我可以更好地追踪它。我的代码使用 foreach 和 %do% 工作得很好,但是当我更改它时 do%dopar% R 会继续给我以下错误:

{ 中的错误:任务 1 失败 - “找不到函数“st_geometry_type””

尽管我在 R 脚本的顶部明确使用了 require(sf) 。我制作了一个小函数,如果语句为真,则仅打印“检查”以复制错误。

require(sf)
require(doParallel)
doParallel::registerDoParallel(cores = 2)

testforeach <- function(sfObject)
{
  foreach(i=1:10) %dopar% {
    if (st_geometry_type(sfObject[i,]) == "LINESTRING")
    {
      print("check")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当我运行这段代码时,它会抛出同样的错误:

{ 中的错误:任务 1 失败 - “找不到函数“st_geometry_type””

但是,当我用 %do% 替换 %dopar% 时,它会打印出所有预期的“检查”消息。这是 R 中的错​​误还是我遗漏了什么?我尝试重新安装我的软件包,但这似乎没有任何影响,因为我继续遇到相同的错误。任何帮助将不胜感激。

r rstudio parallel-foreach doparallel

2
推荐指数
1
解决办法
1616
查看次数

具有数据库连接的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
Run Code Online (Sandbox Code Playgroud)

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

有什么想法吗?

parallel-processing foreach r doparallel

1
推荐指数
1
解决办法
296
查看次数