微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用multdplyr发送不同的dplyr :: muts cols到不同的内核吗?

如何解决使用multdplyr发送不同的dplyr :: muts cols到不同的内核吗?

我有一个函数,将其应用于不同的坐标集,以在标题中创建四个新列。此功能的启动时间很长(将基因组加载到RAM中,将小标题转换为GRanges,并检索序列),但是相对较快,因此100和1,000,000个序列之间的差异并不大。有什么方法可以将mutate中的每个col发送到不同的核心,以便可以同时处理它们?我曾考虑过先使用pivot_long,然后再使用group + partition,但这让我开始思考是否有其他方法可以实现此目的。 multi_mutate种类?
(我不希望乘法器分区/集合在我的情况下可以节省时间,因为附加坐标的成本很小,但是如果我可以避免枢转的时间成本,它仍然相对较小,并且混乱代码,这很酷。)

解决方法

我知道您在寻找现有的软件包,但是我找不到任何东西。其他类似的问题(例如herehere)似乎也不提供软件包。

但是,您如何自己破解呢?用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,b4),.options = future_options(globals = "long_f"))  
tictoc::toc()
# 1.59 sec elapsed

它需要进行一些猜测测试,并且需要进行改进。例如,使用mutate可用的相同方法。但这是一个开始。

请注意,我需要使用future_options

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。