为什么在R中使用这个自举模型时,计算时间会增加4个以上?

当在具有64个内核的x86_64-redhat-
linux-gnu机器上运行下面的代码片段以进行R(版本2.15)中的引导练习时,使用4个以上内核后,观察到的计算时间似乎会降低. R是否需要进行其他配置更改才能使用4个以上的内核?

library(doMC)
library(plyr)
df <- empty <- data.frame(cores = numeric(), trial = numeric(), time = numeric())

for(i in 1:64){
     registerDoMC(cores=i)
     trials <- 1000
     stime <- system.time({
              r <- foreach(icount(trials), .combine=cbind) %dopar% {
                   ind <- sample(1000000, 1000000, replace=TRUE)
                   mean(ind)}})
     df<- rbind(df, data.frame(cores=i,trial=1,time=stime[3]))
}
df2 <- ddply(df, c("cores"), summarize, time_avg = mean(time))

以下是按核心数分类的处理时间.

num_cores time(seconds)
1   16.544
2   8.198
3   5.627
4   4.313
5   7.045
6   8.898
7   10.412
8   11.539
9   12.382
10  13.329
11  13.786
12  14.375
13  14.977
14  15.095
15  14.984
16  15.393
17  15.728
18  15.983
19  16.039
20  15.947
21  16.101
22  16.365
23  16.549
24  16.687
25  17.022
26  17.116
27  17.212
28  17.548
29  17.605
30  17.672
31  18.067
32  18.158
33  16.884
34  17.2
35  17.167
36  17.178
37  17.516
38  17.425
39  17.449
40  17.845
41  17.758
42  17.74
43  18.093
44  14.481
45  14.25
46  18.441
47  18.294
48  18.311
49  18.694
50  18.692
51  15.936
52  16.495
53  16.512
54  18.627
55  19.019
56  18.631
57  13.916
58  19.227
59  19.225
60  13.606
61  18.029
62  19.392
63  19.378
64  19.753

最佳答案 我不认为这是配置R的问题:任务很小,你不能利用许多核心.从“1核心”时间开始,每项任务的时间不到16.5毫秒,而且可能要少得多. foreach包不是针对那种细粒度的问题.

为了有任何希望,你可以尝试使用显式分块:

r <- foreach(n=idiv(trials, chunks=getDoParWorkers()), .combine='c') %dopar% {
  sapply(seq_len(n), function(i) mean(sample(1000000, 1000000, replace=TRUE)))
}

我不知道你的目标是什么,但我会直接使用mclapply来解决这类问题.

点赞