2016-09-05 11 views
0

私はループ内で1000のシミュレーションを実行しています。私の計算時間は{6.496,7.680,9.464,10.976、...、141.460,145.276,143.148}ですが、すべてのシミュレーションはすべて同じ手順なので、同様の計算時間が必要です。彼らは時間とともにひどく増えています。同じ計算(R)の繰り返しごとに計算時間が増加

私の推測では、一時的な記憶やそれに似たものはありませんが、コンピュータサイエンスについてはほとんど分かりません。私は、メモリを使用しているゴミを削除するループを追加するだけの余分なステップを追加する必要があると思います。これは、この不要な時間の無駄を解決するはずです。

私はこれの解決策はなく、これはあなたが私が使用していたコードが

ptm <- proc.time() 
init_pars = c(0.8,0.0175,0.1) 
pars=init_pars 
n_it = 50 
M = matrix(nrow=n_it,ncol=3) 
for (i in 1:n_it){ 
    print(c(pars[1],pars[2],pars[3])) 
    n_it = 10 
    S=list() 
    for (j in 1:n_it){ 
    rec_tree = reconst_tree(bt=s2$t,pars=pars,tt=15) 
    S[[j]] = rec_tree 
    } 
    pars = mle_dd_setoftrees(S) 
    pars = c(pars$lambda,pars$beta,pars$mu) 
    M[i,]=c(pars[1],pars[2],pars[3]) 
    print(proc.time() - ptm) 
    ptm <- proc.time() 
} 

機能であるR.

のためのソリューションを持っていない場合は、なぜ起こるの小さな説明に感謝reconst_treeは独立したシミュレーションを作成し、mle_dd_setoftreesは一連のシミュレーションから見積もりを計算し、次に行列Mに見積もりを格納します。

+0

現在のコードまたは最小限の再現可能な例を投稿してください。詳細はこちら:stackoverflow.com/help/mcve – jav

+0

私の推測では、ループ内のオブジェクトを大きくすることです。 – Roland

+0

どのように結果を保存していますか?ベクトル/リスト全体を割り当てるか、サイズを大きくするすべてのループに効果的にオブジェクト全体をコピーしましたか?また、http://stackoverflow.com/questions/2908822/speed-up-the-loop-operation-in-r –

答えて

1

コードの違反部分は次のとおりです。

Rの柔軟性のためのトレードオフの

ひとつ「オブジェクトの成長」と呼ばれ、あなたがここでやっている10

S=list() 
    for (j in 1:n_it){ 
    rec_tree = reconst_tree(bt=s2$t,pars=pars,tt=15) 
    S[[j]] = rec_tree 
    } 

は、それがオブジェクトに割り当てるためにどのくらいのメモリを決定する多くの時間を費やしているということです。要素をリストに追加するたびに、Rは各要素の内容を再評価して、ループが時間が経つにつれて恐ろしいクロールを引き起こします。

ループ用に構築された井戸は、適切なコンテナをループの前に割り当てることでこれを回避できます。