【发布时间】:2021-03-16 15:48:11
【问题描述】:
我目前正在使用 R 中尺寸为 5663x1000x100 的非常大的数组。我想获得 100 个最大值,这将是每个 5663x1000 矩阵的最大值。
big_array = array(data=rnorm(566300000),dim=c(5663,1000,100))
到目前为止,我尝试过的两种方法包括 for 循环和应用(直觉上它不应该是最快的方法)。
maximas = rep(0,100)
# Method 1 - Runs in 17 seconds
for(i in seq(1,100)){
maximas[i]=max(big_array[,,i])
}
# Method 2 - Runs in 36 seconds
apply(big_array,3,max)
我认为由于数组数据结构,有一种更快的方法来运行它。我已经考虑过pmax(),但据我所知,我必须重塑我的数据(考虑到数组几乎是 4GB,我不想创建另一个对象)。此代码已经是正在并行化的代码的一部分,因此我无法进一步并行化它。
任何想法都会有很大帮助!
【问题讨论】:
-
"apply (从直觉上看不应该是最快的方法" 是一个强有力的陈述。是什么导致你得出这个结论?(顺便说一句:你的代码不完整,缺少一个关闭-paren.)
pmax不适合此用途。 -
顺便说一句,
for循环是maximas <- sapply(seq_len(dim(big_array)[3]), function(i) max(big_array[,,i]))。它比apply更快,并且不需要预先分配maximas。vapply(seq_len(dim(big_array)[3]), function(i) max(big_array[,,i]), numeric(1)). -
每当我试图从某些东西中获得所有速度并且它乞求
apply-like 逻辑时,vapply一直是我的首选功能。它需要更多的努力,但可以获得一些好处。在这种情况下,vapply使用小 100 倍的数据集几乎快 10%。 -
我看到 vapply 的速度提高了 20%,这太棒了!我开始考虑我的情况,因为矩阵对它们没有任何“好”的结构,使用 apply/vapply 是要走的路。
标签: r loops processing-efficiency memory-efficient