如何在使用sapply时应用多核?

时间:2015-07-02 15:52:03

标签: r

R 3.1.2
library(RcppRoll)

我的data.frame

y=
  V1 V2 V3 V4 V5 V6 V7 V8 V9 
1  1  2  3  4  5  6  7  8  9  
2 16 17 18 19 20 21 22 23 24 
3 31 32 33 34 35 36 37 38 NA  
4 46 47 48 49 50 51 52 53 54  

我的职能:

    sapply(y, RcppRoll::roll_mean, n = 3, na.rm = T)

我没有问题并且工作正常,但在使用我的大量数据时速度非常慢。我想知道我们如何使用多核甚至使用for循环加速sapply的性能?

@Khashaa是的,我试过,它更快,但我的输出有问题:

输出:

> 
      [,1] [,2] [,3] 
[1,]   16   17   18 

这会导致我的其余代码出现问题,因此我希望将其更改为:

       V1 V2 V3
[1,]   16 17 18

对此有什么看法?

2 个答案:

答案 0 :(得分:3)

在此具体示例中,您不需要fragment。只需sapply即可

roll_mean(as.matrix(y), 3, na.rm=T)

y <- runif(1e7) dim(y) <- c(1e3, 1e4) y <- data.frame(y) system.time(sapply(y, RcppRoll::roll_mean, n = 3, na.rm = T)) # user system elapsed # 14.120 0.451 18.960 system.time(RcppRoll::roll_mean(as.matrix(y), 3, na.rm=T)) # user system elapsed # 0.329 0.000 0.329 # About 60x times faster 结果的唯一区别是sapply您可以更改如下

colnames

答案 1 :(得分:1)

这样可行:

mclapply(y, roll_mean, n=3, na.rm=TRUE, mc.cores=detectCores())

或者

laply(y, .fun=roll_mean, n=3, na.rm=TRUE, .parallel=TRUE)