根据回复,我测试了两个选项:使用tdigest
包terra
和来自包(cores
参数)的内置并行化例程。Dunning 等人 (2019)的 t-Digest 构造算法使用一维 k 均值聚类的变体来生成非常紧凑的数据结构,从而可以准确估计分位数。我建议使用该tquantile
函数,它可以将测试数据集的处理时间减少三分之一。
对于那些正在考虑foreach
并行化的人来说,没有简单的解决方案可以使用 terra 对象运行 foreach 循环。对于此类任务,我仍在使用良好的旧光栅包。这是计划中的更新,但不是短期的 - 请参阅此处。更多详情如下。
玩具数据集
library(terra)
# load elevation coming with the terra pakage
r <- rast( system.file("ex/elev.tif", package="terra") )
plot(r)
# number of iteration
n_it <- 20
# With `stats::quantile()` function
start_time <- Sys.time()
for (i in 1:n_it){
ra <- aggregate(r, 2 , fun = function(x) quantile(x, probs = .5, na.rm = T))
}
end_time <- Sys.time()
print(end_time-start_time)
时差 6.013551 秒
和tdigest::tquantile()
library(tdigest)
start_time_tdigest <- Sys.time()
for (i in 1:n_it){
ra_tdigest <- aggregate(r, 2 , fun = function(x) tquantile(tdigest(na.omit(x)), probs = .5))
}
end_time_tdigest <- Sys.time()
print(end_time_tdigest-start_time_tdigest)
时差 1.922526 秒
正如 Martin 所怀疑的那样,cores
在函数中使用参数terra:aggregate
并没有提高处理时间:
stats::quantile()
+ 并行化
start_time_parallel <- Sys.time()
for (i in 1:n_it){
ra_tdigest_parallel <- aggregate(r, 2 , fun = function(x) quantile(x, probs = .5, na.rm = T), cores = 2)
}
end_time_parallel <- Sys.time()
print(end_time_parallel-start_time_parallel)
时差 8.537751 秒
tdigest::tquantile()
+ 并行化
tdigest_quantil_terra <- function(x) {
require(tdigest)
tquantile(tdigest(na.omit(x)), probs = .5) }
start_time_tdigest_parallel <- Sys.time() for (i in 1:n_it){
ra_tdigest_parallel <- aggregate(r, 2 ,
fun = function(x, ff) ff(x), cores = 2 ,
ff = tdigest_quantil_terra)
}
end_time_tdigest_parallel <- Sys.time()
print(end_time_tdigest_parallel-start_time_tdigest_parallel)
时差 7.520231 秒
简而言之:
1 tdigest 1.922526 秒
2 base_quantile 6.013551 秒
3 tdigest_parallel 7.520231 秒
4 base_quantile_parallel 8.537751 秒