0

data.table网站,鉴于:

“许多常见操作在内部并行化以使用多个 CPU 线程”

  • 我想知道Map()在 a 中使用时是否是这种情况data.table

询问的原因是因为我注意到在大型数据集上比较相同的操作(cor.test(x, y)具有x = .SD并且y是数据集的单列),使用Map()比使用时执行得更快furrr::fututre_map2()

4

1 回答 1

1

您可以使用这种颇具探索性的方法,并查看使用更多线程时经过的时间是否会缩短。请注意,在我的机器上,可用线程的最大数量只有一个,所以没有区别

library(data.table)

dt <- data.table::data.table(a = 1:3,
                             b = 4:6)
dt
#>    a b
#> 1: 1 4
#> 2: 2 5
#> 3: 3 6

data.table::getDTthreads()
#> [1] 1

# No Prallelisation ----------------------------------
data.table::setDTthreads(1)
system.time({
  
  dt[, lapply(.SD,
              function(x) {
                Sys.sleep(2)
                x}
  )
  ]
})
#>    user  system elapsed 
#>   0.009   0.001   4.017

# Parallel -------------------------------------------
# use multiple threads
data.table::setDTthreads(2)
data.table::getDTthreads()
#> [1] 1

# if parallel, elapsed should be below 4
system.time({
  
  dt[, lapply(.SD,
              function(x) {
                Sys.sleep(2)
                x}
  )
  ]
})
#>    user  system elapsed 
#>   0.001   0.000   4.007

# Map -----------------------------------------------
# if parallel, elapsed should be below 4
system.time({
  
  dt[, Map(f = function(x, y) {
    Sys.sleep(2)
    x},
    .SD,
    1:2
    
  )
  ]
})
#>    user  system elapsed 
#>   0.002   0.000   4.005
于 2021-08-29T10:08:38.070 回答