【问题标题】:Foreach loop returns an error message for first set of workers onlyForeach 循环仅针对第一组工作人员返回错误消息
【发布时间】:2021-05-02 23:25:23
【问题描述】:

在我一直在处理的一个包中开始发生一些非常奇怪的事情。我正在使用带有 doparallel 后端的 foreach 循环来执行重复的随机游走,并在邻接矩阵上重新启动(下面的可重现示例)。

install.packages("Matrix")
install.packages("foreach")
devtools::install_github("https://github.com/DavisWeaver/crosstalkr")
library(foreach)
m <- replicate(1000, sample(x = c(0,1), size = 1000, replace = TRUE))
w <- Matrix::Matrix(m, sparse = TRUE)
w <- Matrix::t(Matrix::t(w)/Matrix::colSums(w)) #normalize based on the column sum.
seeds <- sample(1:nrow(w), size = 32)

每次迭代都应该执行一次随机游走并重新开始,并返回一个亲和度分数的数字向量(因此矩阵输入,一维向量输出)。我尝试在每次迭代中通过更简单的任务重现此错误,但我无法做到。此设置适用于 matrix::colSums(w) 和其他一些琐碎的任务。

为第一组工作人员中的每一个返回以下错误:“”。每次后续迭代都完全按预期执行,没有错误。所以当你运行下面的第一个 foreach 循环时,你会得到the following image.

当您使用相同的并行后端运行后续 foreach 循环时,每次迭代都会按预期执行,there are no error messages!

cl <- parallel::makeCluster(4)
doParallel::registerDoParallel(cl)

n = 8
null_dist <-
  foreach::foreach(i = 1:n, .errorhandling = 'pass') %dopar% {
    crosstalkr::sparseRWR(w, seed_proteins = seeds, norm = FALSE)[[1]]
  }

null_dist <-
  foreach::foreach(i = 1:n, .errorhandling = 'pass') %dopar% {
    crosstalkr::sparseRWR(w, seed_proteins = seeds, norm = FALSE)[[1]]
  }


parallel::stopCluster(cl)

我不知道从这里去哪里...我猜这与我如何设置并行后端有关?任何建议将不胜感激。

【问题讨论】:

    标签: r parallel.foreach doparallel


    【解决方案1】:

    我不确定为什么会发生这种情况。但是,要解决此问题,您需要将.packages = "Matrix" 显式添加到foreach

    如果不指定.packagesnrow 不会产生正确的结果。

    这是一个简化的例子

    library(foreach)
    
    w <- Matrix::Matrix()
    

    您可以看到前四个值是错误的NULL

    cl <- parallel::makeCluster(4)
    doParallel::registerDoParallel(cl)
    
    null_dist <- foreach::foreach(i = seq_len(6)) %dopar% {
      nrow(w)
    }
    
    parallel::stopCluster(cl)
    
    null_dist
    #> [[1]]
    #> NULL
    #> 
    #> [[2]]
    #> NULL
    #> 
    #> [[3]]
    #> NULL
    #> 
    #> [[4]]
    #> NULL
    #> 
    #> [[5]]
    #> [1] 1
    #> 
    #> [[6]]
    #> [1] 1
    

    添加.packages = "Matrix" 可以解决这个问题。

    cl <- parallel::makeCluster(4)
    doParallel::registerDoParallel(cl)
    
    null_dist <- foreach::foreach(i = seq_len(6), .packages = "Matrix") %dopar% {
      nrow(w)
    }
    
    parallel::stopCluster(cl)
    
    null_dist
    #> [[1]]
    #> [1] 1
    #> 
    #> [[2]]
    #> [1] 1
    #> 
    #> [[3]]
    #> [1] 1
    #> 
    #> [[4]]
    #> [1] 1
    #> 
    #> [[5]]
    #> [1] 1
    #> 
    #> [[6]]
    #> [1] 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2020-02-08
      • 2016-03-02
      • 2019-10-30
      相关资源
      最近更新 更多