如何使用多核并行化 R 中的循环?
How to parallelize for loops in R using multiple cores?
我是R的初学者,我有一个任务,我需要做一个类似于for循环的任务,但是对于大量的观察,在这种情况下,500k次。
for (number in 1:500000){
sqrt(number)}
问题是我需要对很多主题进行循环。
所以整个脚本看起来像这样:
for (subject in 1:400){
for (number in 1:500000){
sqrt(number)}
}
我想在我的多个内核 (16) 上并行执行此过程。
我发现在大多数教程中,他们都是这样做的:
library(foreach)
library(doParallel)
registerDoParallel(16)
然后他们继续使用以下方法简单地更改语法:
foreach (subject=1:400) %dopar% {
for (number in 1:500000){
sqrt(number)}
}
对我来说,将所有这些一起使用意味着我将在我的一个处理器上执行范围从 1:500000 的每个 for 循环。所以这意味着,例如,如果 1:500000 循环中的一次迭代的时间复杂度为一小时,那么我将在一小时内进行 16 次迭代,因为我的每个处理器将并行进行一次迭代.
实际上,我通过跟踪经过时间的时间来检查,似乎我的并行过程实际上比顺序过程慢得多。我做错了什么吗?有没有一种简单的方法(初学者友好)告诉我的机器在我机器的一个核心上并行执行每个 1:500000 迭代?
你没有做错任何事,只是你运行宁的操作没有花费足够的时间来使并行执行经济。这是 foreach vignette:
的片段
Running many tiny tasks in parallel will usually take more time to execute than running them sequentially, and if it already runs fast, there’s no motivation to make it run faster anyway. But if the operation that we’re executing in parallel takes a minute or longer, there starts to be some motivation.
如果我们 运行 sqrt
不是 500,000 次,而是 50,000,000 次,您可以看到并行执行的好处。
library(tictoc)
library(foreach)
library(doParallel)
registerDoParallel(16)
tic("no_parallel")
for (subject in 1:400){
for (number in 1:50000000){
sqrt(number)}
}
toc()
#> no_parallel: 271.312 sec elapsed
tic("parallel")
foreach (subject=1:400) %dopar% {
for (number in 1:50000000){
sqrt(number)}
}
toc()
#> parallel: 65.654 sec elapsed
我是R的初学者,我有一个任务,我需要做一个类似于for循环的任务,但是对于大量的观察,在这种情况下,500k次。
for (number in 1:500000){
sqrt(number)}
问题是我需要对很多主题进行循环。 所以整个脚本看起来像这样:
for (subject in 1:400){
for (number in 1:500000){
sqrt(number)}
}
我想在我的多个内核 (16) 上并行执行此过程。 我发现在大多数教程中,他们都是这样做的:
library(foreach)
library(doParallel)
registerDoParallel(16)
然后他们继续使用以下方法简单地更改语法:
foreach (subject=1:400) %dopar% {
for (number in 1:500000){
sqrt(number)}
}
对我来说,将所有这些一起使用意味着我将在我的一个处理器上执行范围从 1:500000 的每个 for 循环。所以这意味着,例如,如果 1:500000 循环中的一次迭代的时间复杂度为一小时,那么我将在一小时内进行 16 次迭代,因为我的每个处理器将并行进行一次迭代.
实际上,我通过跟踪经过时间的时间来检查,似乎我的并行过程实际上比顺序过程慢得多。我做错了什么吗?有没有一种简单的方法(初学者友好)告诉我的机器在我机器的一个核心上并行执行每个 1:500000 迭代?
你没有做错任何事,只是你运行宁的操作没有花费足够的时间来使并行执行经济。这是 foreach vignette:
的片段Running many tiny tasks in parallel will usually take more time to execute than running them sequentially, and if it already runs fast, there’s no motivation to make it run faster anyway. But if the operation that we’re executing in parallel takes a minute or longer, there starts to be some motivation.
如果我们 运行 sqrt
不是 500,000 次,而是 50,000,000 次,您可以看到并行执行的好处。
library(tictoc)
library(foreach)
library(doParallel)
registerDoParallel(16)
tic("no_parallel")
for (subject in 1:400){
for (number in 1:50000000){
sqrt(number)}
}
toc()
#> no_parallel: 271.312 sec elapsed
tic("parallel")
foreach (subject=1:400) %dopar% {
for (number in 1:50000000){
sqrt(number)}
}
toc()
#> parallel: 65.654 sec elapsed