如何解决使用multdplyr发送不同的dplyr :: muts cols到不同的内核吗?
我有一个函数,将其应用于不同的坐标集,以在标题中创建四个新列。此功能的启动时间很长(将基因组加载到RAM中,将小标题转换为GRanges,并检索序列),但是相对较快,因此100和1,000,000个序列之间的差异并不大。有什么方法可以将mutate
中的每个col发送到不同的核心,以便可以同时处理它们?我曾考虑过先使用pivot_long
,然后再使用group
+ partition
,但这让我开始思考是否有其他方法可以实现此目的。 multi_mutate
种类?
(我不希望乘法器分区/集合在我的情况下可以节省时间,因为附加坐标的成本很小,但是如果我可以避免枢转的时间成本,它仍然相对较小,并且混乱代码,这很酷。)
解决方法
我知道您在寻找现有的软件包,但是我找不到任何东西。其他类似的问题(例如here或here)似乎也不提供软件包。
但是,您如何自己破解呢?用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 举报,一经查实,本站将立刻删除。