并行处理以在某些文件包含错误时运行多个文件

时间:2019-05-18 10:51:48

标签: r parallel-processing

我希望使用并行处理来运行文件夹中的每个R文件。一些R文件包含故意错误。一旦遇到第一个错误,这些错误似乎会导致并行处理停止。是否有办法让R继续运行文件夹中的所有文件,并为每个不包含错误的文件返回结果?

这里是R代码,试图运行一个文件夹中的七个文件。七个文件中的三个包含错误,不应运行,但我想获取四个不包含错误的文件的结果。并行处理代码仅返回两个文件的结果,而不是四个文件的结果。

setwd('C:/Users/mark_/Documents/simple R programs/')

library(parallel)

detectCores()
#[1] 12

#make a cluster
my.cluster <- makeCluster(3)

folderName <- 'run_all_these3'
files <- list.files(folderName, full.names=TRUE)

parSapply(my.cluster, files, source)

stopCluster(my.cluster)

这是文件夹run_all_these3中的七个文件。这些文件的区别仅在于seed,输出CSV文件的名称以及三个文件包含summ作为sum的不正确指定。仅针对不包含错误的四个文件中的两个返回输出CSV文件。

我正在R笔记本电脑上运行Windows 10

文件:run1.R

set.seed(1234)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- sum(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum1.csv', row.names=FALSE, quote=FALSE)

文件:run2.R

set.seed(4444)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- sum(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum2.csv', row.names=FALSE, quote=FALSE)

文件:run3.R

set.seed(4321)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- summ(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum3.csv', row.names=FALSE, quote=FALSE)

文件:run4.R

set.seed(1111)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- sum(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum4.csv', row.names=FALSE, quote=FALSE)

文件:run5.R

set.seed(2222)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- summ(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum5.csv', row.names=FALSE, quote=FALSE)

文件:run6.R

set.seed(2121)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- summ(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum6.csv', row.names=FALSE, quote=FALSE)

文件:run7.R

set.seed(3434)
N <- 1000000000
my.stuff <- sample(1000, N, replace = TRUE)
my.sum <- sum(my.stuff)
print(my.sum)
write.csv(my.sum, file='my.sum7.csv', row.names=FALSE, quote=FALSE)

2 个答案:

答案 0 :(得分:2)

您可以使用foreach控制如何处理错误。

library(doParallel)
registerDoParallel(my.cluster <- makeCluster(3))
files <- c("doesnotexist.R")
foreach(file = files, .errorhandling = "remove") %dopar% {
  source(file)
}
stopCluster(my.cluster)

您可以使用.combine合并结果(ccbind等),否则默认情况下它将返回一个列表。

答案 1 :(得分:1)

您可以使用try(source(file, ...))tryCatch(source(file, ...), error = function(e) NULL)(出现错误时返回NULL),例如

parSapply(my.cluster, files, function(file, ...) try(source(file, ...)))

parSapply(my.cluster, files, function(file, ...) {
  tryCatch(source(file, ...), error = function(e) NULL)
})