当我使用mclapply时,偶尔(真的很随机)会出现错误的结果。这个问题在互联网上的其他帖子中被很彻底地描述了,例如(http://r.789695.n4.nabble.com/Bug-in-mclapply-td4652743.html)。然而,还没有提供解决方案。有谁知道如何解决这个问题吗?谢谢!
当我使用mclapply时,偶尔(真的很随机)会出现错误的结果。这个问题在互联网上的其他帖子中被很彻底地描述了,例如(http://r.789695.n4.nabble.com/Bug-in-mclapply-td4652743.html)。然而,还没有提供解决方案。有谁知道如何解决这个问题吗?谢谢!
您提到的Winston Chang报告的问题似乎已在R 2.15.3中修复。在mccollect
中存在一个错误,当将工人结果分配给结果列表时会发生此错误:
if (is.raw(r)) res[[which(pid == pids)]] <- unserialize(r)
如果unserialize(r)
返回NULL,则此方法将失败,因为以这种方式将NULL赋值给列表会删除列表的相应元素。R 2.15.3中对此进行了更改:
if (is.raw(r)) # unserialize(r) might be null
res[which(pid == pids)] <- list(unserialize(r))
work <- function(i, poison) {
if (i == poison) quit(save='no')
i
}
> library(parallel)
> mclapply(1:4, work, 3, mc.cores=2)
[[1]]
NULL
[[2]]
[1] 2
[[3]]
NULL
[[4]]
[1] 4
> cl <- makePSOCKcluster(3)
> parLapply(cl, 1:4, work, 3)
Error in unserialize(node$con) : error reading from connection
mclapply
最初使用 NULLS 填充它创建的列表。当工作进程返回值时,这些值将覆盖 NULLS。如果一个进程在没有返回值的情况下死亡,则 mclapply
将返回一个 NULL。mclapply
的输出似乎已经随机地受到 NULLS 的污染。
https://lwn.net/Articles/317814/