使用 multi dplyr 将不同的 dplyr::mutate 列发送到不同的核心?
Send different dplyr::mutate cols to different cores with multdplyr?
我有一个函数,我将其应用于不同的坐标集以在我的 tibble 中创建四个新列。此函数的启动时间很长(将基因组加载到 RAM 中,将 tibble 转换为 GRanges,然后检索序列)但速度相对较快,因此 100 和 1,000,000 个序列之间没有太大差异。有没有办法将 mutate
中的每个列发送到不同的核心,以便可以同时处理它们?我考虑过使用 pivot_long
然后 group
+partition
但这让我开始思考是否有不同的方法来实现这一点。 multi_mutate
之类的?
(我实际上并不期望乘数 partition/collect 在我的情况下会节省时间,因为额外坐标的成本很小,但如果我能避免旋转的时间成本,它仍然相对较小,而且很乱在我的代码中,那会很酷。)
我知道您正在寻找现有的软件包,但我找不到任何相关内容。其他类似的问题(如here or 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,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
..
我有一个函数,我将其应用于不同的坐标集以在我的 tibble 中创建四个新列。此函数的启动时间很长(将基因组加载到 RAM 中,将 tibble 转换为 GRanges,然后检索序列)但速度相对较快,因此 100 和 1,000,000 个序列之间没有太大差异。有没有办法将 mutate
中的每个列发送到不同的核心,以便可以同时处理它们?我考虑过使用 pivot_long
然后 group
+partition
但这让我开始思考是否有不同的方法来实现这一点。 multi_mutate
之类的?
(我实际上并不期望乘数 partition/collect 在我的情况下会节省时间,因为额外坐标的成本很小,但如果我能避免旋转的时间成本,它仍然相对较小,而且很乱在我的代码中,那会很酷。)
我知道您正在寻找现有的软件包,但我找不到任何相关内容。其他类似的问题(如here or 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,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
..