R 中的并行处理做错了吗?
Parallel processing in R done wrong?
我有一段代码正在尝试使用 foreach-package 并行处理。代码正在运行,但是当我 运行 它在一台有 4 个内核的计算机上时它需要大约 26 分钟,而当我切换到一个有 32 个内核的计算机上时,它仍然需要 13 分钟才能完成。我想知道我是否做错了什么,因为我使用了 8 倍多的内核,但只将时间减少了一半。我的代码如下所示:
no_cores <- detectCores()
cl <- makeCluster(no_cores)
registerDoParallel(cl)
Xenopus_Data <- foreach(b=1:length(newly_populated_vec),.packages = c("raster", "gdistance", "rgdal","sp")) %dopar% { Xenopus_Walk(altdata=altdata,water=water,habitat_suitability=habitat_suitability,max_range_without_water=max_range_without_water,max_range=max_range,slope=slope,Start_Pt=newly_populated_vec[b]) }
stopCluster(cl)
对于 4 核计算机,我得到以下时间:
Time_of_Start
[1] "2016-07-12 13:07:23 CEST"
Time_of_end
[1] "2016-07-12 13:33:10 CEST"
And for the one with 32 cores:
Time_of_Start
[1] "2016-07-12 14:35:48 CEST"
Time_of_end
[1] "2016-07-12 14:48:08 CEST"
这正常吗?如果是这样,有谁知道如何另外加快速度,也许使用不同的包?
非常感谢任何类型的帮助!
编辑:这些是我按照建议应用更正后得到的时间。对于 32 核:
User System elapsed
5.99 40.78 243.97
对于 4 核:
user system elapsed
1.91 0.94 991.71
请注意,我之前通过一些循环进行了多次计算,这就是为什么计算时间大幅减少的原因,但我相信仍然可以看出两台计算机之间的差异增加了。
试试这个,如果问题解决了请告诉我:
library(doParallel)
library(foreach)
registerDoParallel(cores=detectCores())
n <- length(newly_populated_vec)
cat("\nN = ", n, " | Parallel workers count = ", getDoParWorkers(), "\n\n", sep="")
t0 <- proc.time()
Xenopus_Data <- foreach(b=1:n,.packages = c("raster", "gdistance", "rgdal","sp"), .combine=rbind) %dopar% {
Xenopus_Walk(
water=water,
altdata=altdata,
habitat_suitability=habitat_suitability,
max_range_without_water=max_range_without_water,
max_range=max_range,
slope=slope,
Start_Pt=newly_populated_vec[b])
}
TIME <- proc.time() - t0
此外,尝试监控 PC/laptop 中的逻辑内核,以检查是否所有内核都参与了计算。 (Windows 的 TaskManager 和 Linux 的 htop
)
另请注意,内核数量加倍并不一定会带来双倍性能。
我有一段代码正在尝试使用 foreach-package 并行处理。代码正在运行,但是当我 运行 它在一台有 4 个内核的计算机上时它需要大约 26 分钟,而当我切换到一个有 32 个内核的计算机上时,它仍然需要 13 分钟才能完成。我想知道我是否做错了什么,因为我使用了 8 倍多的内核,但只将时间减少了一半。我的代码如下所示:
no_cores <- detectCores()
cl <- makeCluster(no_cores)
registerDoParallel(cl)
Xenopus_Data <- foreach(b=1:length(newly_populated_vec),.packages = c("raster", "gdistance", "rgdal","sp")) %dopar% { Xenopus_Walk(altdata=altdata,water=water,habitat_suitability=habitat_suitability,max_range_without_water=max_range_without_water,max_range=max_range,slope=slope,Start_Pt=newly_populated_vec[b]) }
stopCluster(cl)
对于 4 核计算机,我得到以下时间:
Time_of_Start
[1] "2016-07-12 13:07:23 CEST"
Time_of_end
[1] "2016-07-12 13:33:10 CEST"
And for the one with 32 cores:
Time_of_Start
[1] "2016-07-12 14:35:48 CEST"
Time_of_end
[1] "2016-07-12 14:48:08 CEST"
这正常吗?如果是这样,有谁知道如何另外加快速度,也许使用不同的包? 非常感谢任何类型的帮助!
编辑:这些是我按照建议应用更正后得到的时间。对于 32 核:
User System elapsed
5.99 40.78 243.97
对于 4 核:
user system elapsed
1.91 0.94 991.71
请注意,我之前通过一些循环进行了多次计算,这就是为什么计算时间大幅减少的原因,但我相信仍然可以看出两台计算机之间的差异增加了。
试试这个,如果问题解决了请告诉我:
library(doParallel)
library(foreach)
registerDoParallel(cores=detectCores())
n <- length(newly_populated_vec)
cat("\nN = ", n, " | Parallel workers count = ", getDoParWorkers(), "\n\n", sep="")
t0 <- proc.time()
Xenopus_Data <- foreach(b=1:n,.packages = c("raster", "gdistance", "rgdal","sp"), .combine=rbind) %dopar% {
Xenopus_Walk(
water=water,
altdata=altdata,
habitat_suitability=habitat_suitability,
max_range_without_water=max_range_without_water,
max_range=max_range,
slope=slope,
Start_Pt=newly_populated_vec[b])
}
TIME <- proc.time() - t0
此外,尝试监控 PC/laptop 中的逻辑内核,以检查是否所有内核都参与了计算。 (Windows 的 TaskManager 和 Linux 的 htop
)
另请注意,内核数量加倍并不一定会带来双倍性能。