哪个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)]