2017-09-27 19 views
3

このネストされたforループを最適化しようとしています。これは2つの数値の最小値をとり、その結果をデータフレームに追加します。私は、ベクトル化と初期化を使って大幅に減らすことができましたが、そのロジックをネストされたforループにどのように適用するかについてはあまりよく分かりません。これを迅速に実行するための迅速な方法はありますか?ランタイムの5時間以上に座っている。ループのネストを最適化する方法R

"シミュレーション" 100Kの値、および "制限" している5427個の値

output <- data.frame(matrix(nrow = nrow(simulation),ncol = nrow(limits))) 
res <- character(nrow(simulation)) 

for(i in 1:nrow(limits)){ 
    for(j in 1:nrow(simulation)){ 
     res[j] <- min(limits[i,1],simulation[j,1]) 
    } 
    output[,i] <- res 
} 

編集*

dput(head(simulation)) 
    structure(list(simulation = c(124786.7479,269057.2118,80432.47896,119513.0161,660840.5843,190983.7893)), .Names = "simulation", row.names = c(NA,6L), class = "data.frame") 

dput(head(limits)) 
    structure(list(limits = c(5000L,10000L,20000L,25000L,30000L)), .Names = "limits", row.names = c(NA, 6L), class = "data.frame") 
+0

は 'apply'家族を見てみましょうで、私は' lapply'がで働くだろうと思いますあなたの状況。それは効果的に「for」に取って代わることができ、より迅速に動作する(あるいは、私は他の人を見つけて読んでいる)。また、 'dput(頭部(シミュレーション))'と 'dput(頭部(限界))'を得ることができますか?データの構造を見ることができますか?もしあなたが完全にベクトル化されていれば、「サプリー」は仕事を終わらせるかもしれません(私はそれでは大したことではありません)。 – Badger

+0

あなたは542百万の計算をしています。あなたは、結果として得られる 'output'マトリックスで何をするつもりですか? – thelatemail

+0

@thelatemail制限分散/標準を計算しています。私たちはシミュレーションを使用しているので、理論的な値を計算する良い公式は複雑な分布のためのdev –

答えて

1

お持ちの場合> RAMで15ギガバイト(〜100K * 5500 * 8バイトあたりを持っていますあなたが試すことができます数* 3(結果+外側のxヴァルス+アウターYヴァルス)):

outer(simulation[[1]], limits[[1]], pmin) 

現実にあなたはおそらく15ギガバイトBEC以上が必要になりますが、私はpminは物事をさらに重複すると思うあなたがラムを持っていない場合は、問題を解決する必要があります(例えば、一度に1つの列を実行するコードに依存するなど)。

1

基本的に、ダブルループがある場合は、Rcppを使用すると便利です。

さらに、私はいくつかのRAMを節約するためにbigstatsrパッケージを使用します。ディスクに保存されている行列を作成してアクセスすることができます。だから、

、あなたが行うことができます: '塗りつぶしFBM.cpp' を

simulation <- structure(list(simulation = c(124786.7479,269057.2118,80432.47896,119513.0161,660840.5843,190983.7893)), .Names = "simulation", row.names = c(NA,6L), class = "data.frame") 
limits <- structure(list(limits = c(5000L,10000L,15000L, 20000L,25000L,30000L)), .Names = "limits", row.names = c(NA, 6L), class = "data.frame") 

library(bigstatsr) 
# Create the filebacked matrix on disk (in `/tmp/` by default) 
mat <- FBM(nrow(simulation), nrow(limits)) 
# Fill this matrix in Rcpp 
Rcpp::sourceCpp('fill-FBM.cpp') 
fillMat(mat, limits[[1]], simulation[[1]]) 
# Access the whole matrix in RAM to verify 
# or you could access only block of columns 
mat[] 
mat[, 1:3] 

// [[Rcpp::depends(bigstatsr, BH)]] 
#include <bigstatsr/BMAcc.h> 
#include <Rcpp.h> 
using namespace Rcpp; 


// [[Rcpp::export]] 
void fillMat(Environment BM, 
      const NumericVector& limits, 
      const NumericVector& simulation) { 

    XPtr<FBM> xpBM = BM["address"]; 
    BMAcc<double> macc(xpBM); 

    int n = macc.nrow(); 
    int m = macc.ncol(); 

    for (int i = 0; i < m; i++) 
    for (int j = 0; j < n; j++) 
     macc(j, i) = std::min(limits[i], simulation[j]); 
} 
関連する問題