首页 文章

如何使purrr map功能运行得更快?

提问于
浏览
2

我正在使用 purrr 库中的 map 函数来应用 segmented 函数(来自 segmented 库),如下所示:

library(purrr)
library(dplyr)
library(segmented)

# Data frame is nested to create list column
by_veh28_101 <- df101 %>% 
  filter(LCType=="CFonly", Lane %in% c(1,2,3)) %>% 
  group_by(Vehicle.ID2) %>% 
  nest() %>% 
  ungroup()

# Functions:
segf2 <- function(df){
  try(segmented(lm(svel ~ Time, data=df), seg.Z = ~Time,
                psi = list(Time = df$Time[which(df$dssvel != 0)]),
                control = seg.control(seed=2)),
      silent=TRUE)
}


segf2p <- function(df){
  try(segmented(lm(PrecVehVel ~ Time, data=df), seg.Z = ~Time,
                psi = list(Time = df$Time[which(df$dspsvel != 0)]),
                control = seg.control(seed=2)),
      silent=TRUE)
}  

# map function:
models8_101 <- by_veh28_101 %>% 
  mutate(segs = map(data, segf2),
         segsp = map(data, segf2p))

对象 by_veh28_101 包含2457 tibbles . 最后一步,使用 map 函数,需要16分钟才能完成 . 有没有办法让这更快?

1 回答

  • 3

    您可以使用函数 future_map 而不是 map .

    此函数来自包 furrr ,是 map 系列的并行选项 . 这是包的README的链接 .

    因为你的代码问题不可复制,所以我无法在 mapfuture_map 函数之间准备基准 .

    您使用 future_map 函数的代码如下:

    library(tidyverse)
    library(segmented)
    library(furrr)
    
    
    # Data frame stuff....
    
    # Your functions....
    
    # future_map function
    
    # this distribute over the different cores of your computer
    # You set a "plan" for how the code should run. The easiest is `multiprocess`
    # On Mac this picks plan(multicore) and on Windows this picks plan(multisession)
    
    plan(strategy = multiprocess)
    
    models8_101 <- by_veh28_101 %>% 
      mutate(segs = future_map(data, segf2),
             segsp = future_map(data, segf2p))
    

相关问题