哪个R包适合并行计算?如何加速给定的代码?
Which R package is suitable for parallel computing? How to speed up the given code?
哪个 R 包最适合并行计算?
我对侧重于处理 time/vectorisation/user 友好语法的建议感兴趣(寻找 2022 年 1 月有效的信息(包括新颖性))。
下面是问题的第二部分:
我想遍历一个大列表中的许多(数千)个向量,所以我想加快速度。
这是我可以做的一个例子。在 for 循环中,我放置了一些简单的重新缩放匿名函数来提供 reprex。 IRL 我有更复杂的计算要做。可以加快速度吗?怎么样?
```{r}
library(foreach)
library(doParallel)
#this is dummy list of vecs:
set.seed(123)
v1 <- sample(600:800, 108, replace=TRUE)
v2 <- sample(600:800, 120, replace=TRUE)
v3 <- sample(550:800, 200, replace=TRUE)
v4 <- sample(640:800, 120, replace=TRUE)
v5 <- sample(700:810, 131, replace=TRUE)
v6 <- sample(600:800, 220, replace=TRUE)
v7 <- sample(600:850, 149, replace=TRUE)
v8 <- sample(530:800, 144, replace=TRUE)
v9 <- sample(600:810, 129, replace=TRUE)
v10 <- sample(600:860, 170, replace=TRUE)
list1 <- list()
list1[["first"]] <- v1
list1[["named"]] <- v2
list1[["vector"]] <- v3
list1[["out"]] <- v4
list1[["of"]] <- v5
list1[["many"]] <- v6
list1[["within"]] <- v7
list1[["this"]] <- v8
list1[["dummy"]] <- v9
list1[["list"]] <- v10
#this function rescales vectors within a given list to 0-255 range
parallelism_test <- function(list){
# split list into chunks
index_list = split(1:length(names(list1)), ceiling(1:length(names(list1))/100))
#create empty list for extracted data
newlist = list()
# loop for parallel extraction
for (indx in 1:length(index_list)){
# use selected number of cores
doParallel::registerDoParallel(cores = 5)
# work in parallel (rescale vector to 0-255 range)
newlist <- c(newlist, foreach::foreach(nam = names(list1)[index_list[[indx]]]) %dopar% (function (x) {(x - min(x))* (1/(max(x) - min(x))*255)})(list[[nam]]))}
return(newlist)
}
test<- parallelism_test(list1)
print(test)
```
如有任何建议,我将不胜感激。
有很多用于并行计算的包,但我更喜欢内置的 parallel
包。
在这种情况下代码非常干净
vscale <- function(x) {
(x - min(x))/(max(x) - min(x))*255
}
library(parallel)
cl <- makeCluster(4)
list2 <- parLapply(cl, list1, vscale)
虽然在这个特定的情况下,我怀疑将数据存储在 data.table
中并使用它,在许多情况下会更快。 data.table
必要时也会使用多线程。在下面的示例中,我首先从原始列表创建 data.table
。当然,在这种情况下,确保数据从一开始就以 data.table
结尾会更好。
library(data.table)
dta <- lapply(names(list1),
function(col) data.table(group = col, value = list1[[col]]))
dta <- rbindlist(dta)
dta[, value := vscale(value)]
哪个 R 包最适合并行计算?
我对侧重于处理 time/vectorisation/user 友好语法的建议感兴趣(寻找 2022 年 1 月有效的信息(包括新颖性))。
下面是问题的第二部分:
我想遍历一个大列表中的许多(数千)个向量,所以我想加快速度。
这是我可以做的一个例子。在 for 循环中,我放置了一些简单的重新缩放匿名函数来提供 reprex。 IRL 我有更复杂的计算要做。可以加快速度吗?怎么样?
```{r}
library(foreach)
library(doParallel)
#this is dummy list of vecs:
set.seed(123)
v1 <- sample(600:800, 108, replace=TRUE)
v2 <- sample(600:800, 120, replace=TRUE)
v3 <- sample(550:800, 200, replace=TRUE)
v4 <- sample(640:800, 120, replace=TRUE)
v5 <- sample(700:810, 131, replace=TRUE)
v6 <- sample(600:800, 220, replace=TRUE)
v7 <- sample(600:850, 149, replace=TRUE)
v8 <- sample(530:800, 144, replace=TRUE)
v9 <- sample(600:810, 129, replace=TRUE)
v10 <- sample(600:860, 170, replace=TRUE)
list1 <- list()
list1[["first"]] <- v1
list1[["named"]] <- v2
list1[["vector"]] <- v3
list1[["out"]] <- v4
list1[["of"]] <- v5
list1[["many"]] <- v6
list1[["within"]] <- v7
list1[["this"]] <- v8
list1[["dummy"]] <- v9
list1[["list"]] <- v10
#this function rescales vectors within a given list to 0-255 range
parallelism_test <- function(list){
# split list into chunks
index_list = split(1:length(names(list1)), ceiling(1:length(names(list1))/100))
#create empty list for extracted data
newlist = list()
# loop for parallel extraction
for (indx in 1:length(index_list)){
# use selected number of cores
doParallel::registerDoParallel(cores = 5)
# work in parallel (rescale vector to 0-255 range)
newlist <- c(newlist, foreach::foreach(nam = names(list1)[index_list[[indx]]]) %dopar% (function (x) {(x - min(x))* (1/(max(x) - min(x))*255)})(list[[nam]]))}
return(newlist)
}
test<- parallelism_test(list1)
print(test)
```
如有任何建议,我将不胜感激。
有很多用于并行计算的包,但我更喜欢内置的 parallel
包。
在这种情况下代码非常干净
vscale <- function(x) {
(x - min(x))/(max(x) - min(x))*255
}
library(parallel)
cl <- makeCluster(4)
list2 <- parLapply(cl, list1, vscale)
虽然在这个特定的情况下,我怀疑将数据存储在 data.table
中并使用它,在许多情况下会更快。 data.table
必要时也会使用多线程。在下面的示例中,我首先从原始列表创建 data.table
。当然,在这种情况下,确保数据从一开始就以 data.table
结尾会更好。
library(data.table)
dta <- lapply(names(list1),
function(col) data.table(group = col, value = list1[[col]]))
dta <- rbindlist(dta)
dta[, value := vscale(value)]