r-发送不同的dplyr::用multdplyr将cols突变到不同的核心



我有一个函数,我正在将它应用于不同的坐标集,以在我的tibble中创建四个新列。该功能的启动时间相当长(将基因组加载到RAM中,将tibble转换为GRanges,并检索序列(,但速度相对较快,因此100和1000000个序列之间没有太大差异。有没有办法将mutate中的每个列发送到不同的核心,以便同时处理它们?我曾想过使用pivot_long,然后使用group+partition,但这让我思考是否有不同的方法来实现这一点。multi_mutate
(在我的情况下,考虑到额外坐标的小成本,我实际上并不希望多像素分区/收集能节省那么多时间,但如果我能避免数据透视的时间成本(它仍然相对较小(和代码混乱,那就太酷了。(

我知道你在寻找一个现有的包,但我找不到任何东西。其他类似的问题(如这里或这里(似乎也没有提供包。。

然而,你自己破解它怎么样。。。使用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

这需要一些测试和猜测。。它需要改进。。例如使用可用于CCD_ 7的相同方法。但这只是一个开始。

注意,我需要使用future_options。。

相关内容

  • 没有找到相关文章

最新更新