R

时间:2017-08-19 16:47:10

标签: r parallel-processing

我正在尝试在非常大的数据集上运行某些东西。基本上,我想遍历文件夹中的所有文件并在其上运行 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)   
}

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

 dat<- parLapply(cl,files,readJson)

当它到达的文件没有正确结束并且没有创建列表时会产生错误&#39; dat&#39;通过跳过有问题的文件。这是readJson函数应该缓解的内容。

当我使用普通的lapply时,它的效果非常好。它会生成错误,但是,它仍然会跳过错误的文件来创建列表。

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

2 个答案:

答案 0 :(得分:3)

error处理程序中,函数cond是一个错误条件。 message(cond)表示这种情况,它被工作人员捕获并作为错误传送给主人。删除message电话或将其替换为类似的电话 message(conditionMessage(cond)) 但是你不会在主人身上看到任何东西,所以删除可能是最好的。

答案 1 :(得分:0)

你能做的就是这样(另一个例子,可重现):

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"一起使用将是另一个很好的解决方案。