我有这段代码,我使用untar
将gunzip
(使用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
我确信我有书面许可。
由于这种情况发生在随机点,因此无法再现。
我现在的问题是,我可以捕获错误并跳过文件并继续处理吗?
感谢任何帮助。
答案 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))