gpt4 book ai didi

r - 分组是否在data.table 1.12.0中并行化?

转载 作者:行者123 更新时间:2023-12-03 20:27:28 27 4
gpt4 key购买 nike

data.table v1.12.0的更新日志中,我注意到以下内容:

Subsetting, ordering and grouping now use more parallelism



我测试了是否可以加快一些分组速度,但是没有成功。我做了几个不同的测试,并且我总是得到相同的结果。分组实际上是并行的吗?也许我没有正确使用线程选项?如您所见, data.table已经用 openmp编译,否则 setDTthread打印一条消息,告诉用户不支持 openmp。这是我的一项测试的可复制示例。
library(data.table)

n = 5e6
k = 1e4

DT = data.table(x = runif(n), y = runif(n), grp = sample(1:k, n, TRUE))

# Any function not too fast
f = function(x,y) as.list(eigen(cov(cbind(x,y)), only.values = TRUE)$value)

setDTthreads(1)
getDTthreads()
#> [1] 1

system.time(DT[ , f(x,y), by = grp])
#> utilisateur système écoulé
#> 3.365 0.008 3.374

setDTthreads(0)
getDTthreads(T)
#> omp_get_max_threads() = 4
#> omp_get_thread_limit() = 2147483647
#> DTthreads = 0
#> RestoreAfterFork = true
#> [1] 4

system.time(DT[ , f(x,y), by = grp])
#> utilisateur système écoulé
#> 3.324 0.029 3.238

reprex package(v0.2.1)创建于2019-01-27

最佳答案

是的,分组在v 1.12.0 中是并行的

您的基准测试有点像是鲱鱼。如果要隔离分组速度,则需要快速的f(x, y)。使用您的示例的基数,但使用一个简单的函数,我们得到:

library(data.table)
packageVersion("data.table")
#> [1] '1.12.0'

n = 5e6
N <- n
k = 1e4

print(getDTthreads())
#> [1] 12

DT = data.table(x = rep_len(runif(n), N),
y = rep_len(runif(n), N),
grp = rep_len(sample(1:k, n, TRUE), N))
bench::system_time(DT[, .(a = 1L), by = "grp"])
#> process real
#> 250.000ms 72.029ms

setDTthreads(1)

bench::system_time(DT[, .(a = 1L), by = "grp"])
#> process real
#> 125.000ms 126.385ms

reprex package(v0.2.1)创建于2019-02-01

也就是说,在并行情况下,我们的速度稍快一些,但仅提高了约50毫秒-与函数的3 s相比可以忽略不计。

如果我们扩大DT的大小,我们可以看到更大的差异:

library(data.table)
packageVersion("data.table")
#> [1] '1.12.0'

n = 5e6
N <- 1e9
k = 1e4

print(getDTthreads())
#> [1] 12

DT = data.table(x = rep_len(runif(n), N),
y = rep_len(runif(n), N),
grp = rep_len(sample(1:k, n, TRUE), N))
bench::system_time(DT[, .(a = 1L), by = "grp"])
#> process real
#> 45.719s 14.485s

setDTthreads(1)

bench::system_time(DT[, .(a = 1L), by = "grp"])
#> process real
#> 24.859s 24.890s

sessioninfo::session_info()
#> - Session info ----------------------------------------------------------
#> setting value
#> version R version 3.5.2 (2018-12-20)
#> os Windows 10 x64
#> system x86_64, mingw32
#> ui RTerm
#> language (EN)
#> collate English_Australia.1252
#> ctype English_Australia.1252
#> tz Australia/Sydney
#> date 2019-02-01
#>

reprex package(v0.2.1)创建于2019-02-01

关于r - 分组是否在data.table 1.12.0中并行化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54394703/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com