【发布时间】:2016-02-08 16:03:16
【问题描述】:
我一直在尝试在 R 中运行一个并行化的 foreach 循环,它可以正常运行大约十次迭代,但随后崩溃,显示错误:
Error in { : task 7 failed - "missing value where TRUE/FALSE needed"
Calls: %dopar% -> <Anonymous>
Execution halted
我将每个循环的结果附加到一个文件中,该文件确实显示了预期的输出。我的脚本如下,使用this post中的combn_sub函数:
LBRA <- fread(
input = "LBRA.012",
data.table = FALSE)
str_bra <- nrow(LBRA)
br1sums <- colSums(LBRA)
b1non <- which(br1sums == 0)
LBRA_trim <- LBRA[,-b1non]
library(foreach)
library(doMC)
registerDoMC(28)
foreach(X = seq(2, (nrow(LBRA)-1))) %dopar% {
com <- combn_sub(
x = nrow(LBRA),
m = X,
nset = 1000)
out_in <- matrix(
ncol = 2,
nrow = 1)
colnames(out) <- c("SNPs", "k")
for (A in seq(1, ncol(com))){
rowselect <- com[, A]
sub <- LBRA_trim[rowselect, ]
subsum <- colSums(sub)
length <- length(which(subsum != 0)) - 1
out_in <- rbind(out_in, c(length, X))
}
write.table(
file = "plateau.csv",
sep = "\t",
x = out_in,
append = TRUE)
}
【问题讨论】:
-
您是否尝试过在不使用
%dopar%的情况下运行前 10 次迭代来查看它在哪一行失败?我的猜测是,该行数据中的某些内容与其他未被考虑的数据行不同。 -
从并行循环内部写入文件对我来说似乎是不明智的。
-
在调用
registerDoMC(28)之前显式创建您的多核集群并指定一个日志文件。这样你就可以看到发生了什么:cluster <- makeCluster(28, outfile="MulticoreLogging.txt"); registerDoMc(cluster);