【问题标题】:TryCatch with parLapply (Parallel package) in R在 R 中使用 parLapply(并行包)的 TryCatch
【发布时间】:2017-08-19 16:47:09
【问题描述】:

我正在尝试在一个非常大的数据集上运行某些东西。基本上,我想遍历文件夹中的所有文件并在其上运行函数 fromJSON。但是,我希望它跳过产生错误的文件。但是,我使用 tryCatch 构建了一个函数,该函数仅在我使用函数 lappy 而不是 parLapply 时有效。

这是我的异常处理函数的代码:

readJson <- function (file) {
 require(jsonlite)
 dat <- tryCatch(
        {
         fromJSON(file, flatten=TRUE)      
        },
         error = function(cond) {
                 message(cond)
                 return(NA)
        },
         warning = function(cond) {
                  message(cond)
                  return(NULL)
                  }
   )
  return(dat)   
}

然后我在包含 JSON 文件的完整路径的字符向量 files 上调用 parLapply:

 dat<- parLapply(cl,files,readJson)

当它到达一个没有正确结束的文件并且没有通过跳过有问题的文件来创建列表“dat”时会产生错误。这是 readJson 函数应该减轻的。

当我使用常规 lapply 时,它工作得非常好。它会生成错误,但是,它仍然会通过跳过错误文件来创建列表。

关于如何使用 parLappy 并行处理异常以跳过有问题的文件并生成列表的任何想法?

【问题讨论】:

    标签: r parallel-processing


    【解决方案1】:

    在您的error 处理函数中cond 是一个错误条件。 message(cond) 表示这种情况,它被工人捕获并作为错误传输给主人。要么删除 message 调用,要么用类似的东西替换它们 message(conditionMessage(cond)) 但是,您不会在 master 上看到任何内容,因此最好删除。

    【讨论】:

      【解决方案2】:

      你可以做的是这样的事情(另一个例子,可重现):

      test1 <- function(i) {
        dat <- NA
        try({
          if (runif(1) < 0.8) {
            dat <- rnorm(i)
          } else {
            stop("Error!")
          } 
        })
        return(dat)   
      }
      cl <- parallel::makeCluster(3)
      dat <- parallel::parLapply(cl, 1:100, test1)
      

      有关其他解决方案,请参阅此related question。我认为使用foreach.errorhandling = "pass" 将是另一个很好的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-08
        • 2015-06-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        • 2017-09-26
        • 1970-01-01
        • 2017-06-10
        相关资源
        最近更新 更多