捕获pbsapply产生的错误

时间:2017-08-23 10:46:31

标签: r multithreading

我有这段代码,我使用untargunzip(使用pbsapply)一堆文件复制到我的硬盘上的目录中:

library(pbapply)
library(parallel)
library(R.utils)

unpack <- function(x, exdir, remove, overwrite, skip){
  copy <- paste(exdir, tail(unlist(strsplit(x, "/")), 1), sep = "")
  file.copy(from = x, to = copy)
  x <- copy
  gunzip(as.character(x), remove = remove, overwrite = overwrite, skip = skip)
}

files <- as.matrix(dir(path.to.files, pattern = ".tar.gz"))

expath <- "C:/temp/

cl <- makeCluster(detectCores()-1)
clusterExport(cl, "unpack")
clusterExport(cl, "files")
clusterExport(cl, "expath")

pbsapply(cl = cl, t(files), FUN = function(x){
         unpack(x, exdir = expath, overwrite = FALSE, skip = TRUE, remove = TRUE)
       })

我使用gunzip因为我想保留.tar文件而不提取它们。

原则上代码工作得很好。但是,在随机点,我得到错误:

  

checkForRemoteErrors出错:一个节点产生错误:没有目录的写权限:C:/ temp

我确信我有书面许可。

由于这种情况发生在随机点,因此无法再现。

我现在的问题是,我可以捕获错误并跳过文件并继续处理吗?

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

R.utils的作者:这可能是因为竞争条件,每个工作人员断言C:/temp/存在并且它具有该文件夹的写权限。如果工作人员发现C:/temp/不存在,则会尝试创建它。现在,如果多个工作人员同时尝试创建它,您可能会遇到竞争条件。

尝试在启动并行代码之前确保C:\temp\确实存在,例如dir.create(expath)。如果这有所作为,请告诉我。

另外,为了尝试重现这一点,detectCores()有多大,你有多少tar.gz个文件?

BTW,该行

copy <- paste(exdir, tail(unlist(strsplit(x, "/")), 1), sep = "")

看起来很复杂。 AFAIU,tail(unlist(strsplit(x, "/")), 1)可由basename(x)替换,例如与C:/a/b/c.tar.gz您获得c.tar.gz。另外,请使用paste(),而不是使用file.path()来构建路径。换句话说,做一些像:

copy <- file.path(exdir, basename(x))