3

大きな 3 次元配列 (437216,8,3) の最初の 2 次元で平均と標準偏差を実行する 2 つの適用関数があります。Rx32 で完了するのに 16 分かかります。これは、このスクリプトを定期的に適用しているデータベース内の多くの大きな配列の最初のものです。実行時間を短縮する方法について何か考えはありますか?

4

3 に答える 3

1

それは非常に遅いようです。私のマシンで

set.seed(10)

x = array(rnorm(437216*8*3), dim = c(437216,8,3))

system.time(apply(x, 1, mean))

かかります

   user  system elapsed 
 23.903   0.263  24.522 

FWIW、

system.time(apply(x, 2, mean))
       user  system elapsed 
      0.546   0.274   0.841 


system.time(apply(x, 3, mean))
   user  system elapsed 
  0.516   0.267   0.790 

あなたの sessionInfo() は何ですか?

sessionInfo()
R version 2.11.1 (2010-05-31) 
i386-apple-darwin9.8.0 

locale:
[1] en_US.UTF-8/en_US.UTF-8/C/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
[1] cimis_0.1-3    RLastFM_0.1-4  RCurl_1.4-2    bitops_1.0-4.1 XML_3.1-0      lattice_0.18-8

loaded via a namespace (and not attached):
[1] grid_2.11.1  tools_2.11.1
于 2010-09-10T18:01:41.583 に答える
0

私の systemInfo() は次のとおりです。

sessionInfo() R version 2.11.0 (2010-04-22) x86_64-pc-mingw32

locale: [1] LC_COLLATE=English_United States.1252 [2] LC_CTYPE=English_United States.1252 [3] LC_MONETARY=English_United States.1252 [4] LC_NUMERIC=C [5] LC_TIME=English_United States.1252

attached base packages: [1] stats     graphics  grDevices utils     datasets methods   base

other attached packages: [1] abind_1.1-0   RSQLite_0.9-1 DBI_0.2-5

適用機能は、1 番目と 2 番目のマージン (1:2) の両方に適用され、システム時間がそれを下回っています。より優れたコンピューター/システム (上記) で実行し、実行時間をいくらか短縮しましたが (以下)、それでも必要以上に時間がかかっているようです:

>  system.time(apply(x,1:2,mean))   
user  system elapsed
311.56    0.30  311.88
> system.time(apply(x,1:2,sd))    
user  system elapsed
505.92    0.21  506.81

2番目の提案のように、それをdata.frameに変換してリストから外すことを検討します。助けてくれてありがとう!

于 2010-09-13T15:29:39.347 に答える
0

編集:OPから提供されたコードの後、問題が明らかになりました。トリックは、それをデータフレームに変換することです:

> x = array(rnorm(437216*8*3), dim = c(437216,8,3))

> system.time(apply(x,1:2,mean))
   user  system elapsed 
 107.06    0.18  107.34 
 # This is run on a new quadcore i7, so it's not a slow machine...

> Tmp <- data.frame(V1=as.vector(x[,,1]),
+             V2=as.vector(x[,,2]),
+             V3= as.vector(x[,,3]))

> system.time({
+     Means <- rowMeans(Tmp)
+     Sd <- sqrt(rowSums((Tmp-Means)^2)/(3-1))
+ })
   user  system elapsed 
   6.72    0.40    7.12 

正しいマトリックスで結果を取得するには:

Means <- matrix(Means,ncol=8)
Sd <- matrix(Sd,ncol=8)

コンセプトの証明 :

x = array(rnorm(10*8*3), dim = c(10,8,3))

m1 <- apply(x,1:2,mean)
sd1 <- apply(x,1:2,sd)

Tmp <- data.frame(V1=as.vector(x[,,1]),
            V2=as.vector(x[,,2]),
            V3= as.vector(x[,,3]))
m2 <- rowMeans(Tmp)

sd2 <- sqrt(rowSums((Tmp-m2)^2)/2)

m2 <-matrix(m2,ncol=8)
sd2 <- matrix(sd2,ncol=8)

> all.equal(m1,m2)
[1] TRUE

> all.equal(sd1,sd2)
[1] TRUE
于 2010-09-10T16:11:35.373 に答える