我正在使用multicore包中的mclapply (在Ubuntu上),并且我正在编写一个函数,该函数要求按顺序返回mclapply(x, f)的结果(即f(x[1]), f(x[2]), ...., f(x[n]))。
# multicore doesn't work on Windows
require(multicore)
unlist(mclapply(
1:10,
function(x){
Sys.sleep(sample(1:5, size = 1))
identity(x)}, mc.cores = 2))
[1] 1 2 3 4 5 6 7 8 9 10上面的代码似乎暗示了mclapply返回结果的顺序与lapply相同。
然而,如果这个假设是错误的,我将不得不花很长时间重构我的代码,所以我希望从更熟悉这个包/并行计算的人那里得到保证,这个假设是正确的。
假设mclapply总是按顺序返回结果,而不管给它提供了什么可选参数,这样做安全吗?
发布于 2013-02-07 06:59:40
简而言之:它确实以正确的顺序返回结果。
当然,您应该自己阅读代码(mclapply是一个R函数...)
collect的手册页提供了更多提示:
注意:如果expr使用诸如sendMaster之类的低级多核函数,则单个作业可以多次交付结果,用户有责任正确解释这些结果。
然而,如果你不去打乱低级,
collect返回列表中所有可用的结果。结果将与指定的作业具有相同的顺序。如果有多个作业并且作业具有名称,则将使用结果命名,否则将使用其进程ID。
(我的重点)
现在到mclapply了。快速浏览一下源代码会产生以下结果:
!mc.preschedule且作业数不超过核心(length (X) <= cores) parallel和collect,请参见上文。mc.preschedule或比核心更多的作业,则mclapply自己负责订单-请参阅代码。然而,这里是你的实验的一个稍微修改过的版本:
> unlist (mclapply(1:10, function(x){
Sys.sleep(sample(1:5, size = 1));
cat (x, " ");
identity(x)},
mc.cores = 2, mc.preschedule = FALSE))
1 2 4 3 6 5 7 8 9 10 [1] 1 2 3 4 5 6 7 8 9 10
> unlist (mclapply(1:10, function(x){
Sys.sleep(sample(1:5, size = 1));
cat (x, " ");
identity(x)},
mc.cores = 2, mc.preschedule = TRUE))
1 3 2 5 4 6 7 8 10 9 [1] 1 2 3 4 5 6 7 8 9 10这表明子作业以不同的顺序返回结果(更准确地说:子作业将以不同的顺序完成),但结果是按原始顺序组合的。
(可以在控制台上运行,但不能在RStudio中运行-cat不会显示在控制台上)
https://stackoverflow.com/questions/14697901
复制相似问题