从data.table
包网站,鉴于:
“许多常见操作在内部并行化以使用多个 CPU 线程”
- 我想知道
Map()
在 a 中使用时是否是这种情况data.table
?
询问的原因是因为我注意到在大型数据集上比较相同的操作(cor.test(x, y)
具有x = .SD
并且y
是数据集的单列),使用Map()
比使用时执行得更快furrr::fututre_map2()
。
从data.table
包网站,鉴于:
“许多常见操作在内部并行化以使用多个 CPU 线程”
Map()
在 a 中使用时是否是这种情况data.table
?询问的原因是因为我注意到在大型数据集上比较相同的操作(cor.test(x, y)
具有x = .SD
并且y
是数据集的单列),使用Map()
比使用时执行得更快furrr::fututre_map2()
。
您可以使用这种颇具探索性的方法,并查看使用更多线程时经过的时间是否会缩短。请注意,在我的机器上,可用线程的最大数量只有一个,所以没有区别
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