0

我有一个函数应用于不同的坐标集,以在我的 tibble 中创建四个新列。该函数的启动时间相当长(将基因组加载到 RAM 中,将 tibble 转换为 Granges,并检索序列)但相对较快,因此 100 和 1,000,000 个序列之间没有太大区别。有没有办法将每个 col 发送mutate到不同的核心,以便可以同时处理它们?我考虑过使用pivot_long然后group+partition但这让我思考是否有不同的方法来实现这一点。一种multi_mutate
(考虑到额外坐标的成本很小,我实际上并不期望乘法器分区/收集在我的情况下会节省时间,但是如果我可以避免旋转的时间成本,它仍然相对较小,并且在我的代码,那会很酷。)

4

1 回答 1

2

我知道您正在寻找现有的包裹,但我找不到任何东西。其他类似的问题(如这里这里)似乎也没有提供包..

但是,你自己破解它怎么样......看看这个例子furrr

### libraries
library(dplyr)
library(furrr)

### data complaint with your example
d <- replicate(8, rnorm(100))
colnames(d) <- apply(expand.grid(letters[1:2], 1:4), 1, paste0, collapse = "")
d <- as_tibble(d)

### a function that take more than a second to finish..
long_f <- function(x1, x2){
  
  Sys.sleep(1)
  x1+x2
  
}

### multimutate!
multimutate <- function(.data, ..., .options = future_options()){
  
  dots <- enquos(..., .named = TRUE)
  .data[names(dots)] <- future_map(dots, ~rlang::eval_tidy(., data = .data, env = parent.frame()), .options = .options)
  .data
  
}


# no future strategy implemented
tictoc::tic()
d %>%
  multimutate(c1 = long_f(a1,b1), 
              c2 = long_f(a2,b2),
              c3 = long_f(a3,b3), 
              c4 = long_f(a4,b4))  
tictoc::toc()
# 4.34 sec elapsed

# future strategy
plan(multiprocess)
tictoc::tic()
d %>%
  multimutate(c1 = long_f(a1,b1), 
              c2 = long_f(a2,b2),
              c3 = long_f(a3,b3), 
              c4 = long_f(a4,b4),
              .options = future_options(globals = "long_f"))  
tictoc::toc()
# 1.59 sec elapsed

它需要一些测试猜测..并且需要改进..例如使用可用于mutate. 但这是一个开始。

请注意,我需要使用future_options..

于 2020-09-12T13:16:34.790 回答