実行に非常に時間がかかるコードに挑戦しており、このコードの実行時間を最適化するための重要なトリックは何なのか疑問に思っています。入力 data.frame が重要 (140,000 行) であり、出力 data.frame が約 220,000 行であることを認めなければなりません。
入力 data.frame のサンプル:
head(extremes)
X_BusinessIDDescription min max month
ID105 2007-12-01 2008-06-01 2007-12-01
ID206 2007-12-01 2009-07-01 2007-12-01
ID204 2007-12-01 2008-02-01 2007-12-01
ID785 2008-07-01 2010-08-01 2008-07-01
ID125 2007-11-01 2008-07-01 2007-11-01
ID107 2007-11-01 2011-06-01 2007-11-01
ループで拡張される data.frame。data.frame は、構造を適切に取得するために開始されます。
output <- extremes[1,]
output
X_BusinessIDDescription min max month
ID105 2007-12-01 2008-06-01 2007-12-01
その他の値
IDcounter <- 1
IDmax <- nrow(extremes)
linecounter <- 1
最適化したい while ループ:
while (IDcounter <= IDmax){
start <- extremes$min[IDcounter]
end <- extremes$max[IDcounter] # add three months
while(start <= end){
output[linecounter,] <- extremes[IDcounter,]
output$month[linecounter] <- start
linecounter <- linecounter+1
start <- seq(start, by ="month", length=2)[2]
}
IDcounter <- IDcounter + 1
}
行数が少ない場合、このコードは非常に高速に実行されますが、出力が長くなるにつれて速度が低下しているように見えます。
出力は次のようになります。
head(output)
X_BusinessIDDescription min max month
ID105 2007-12-01 2008-06-01 2007-12-01
ID105 2007-12-01 2008-06-01 2008-01-01
ID105 2007-12-01 2008-06-01 2008-02-01
ID105 2007-12-01 2008-06-01 2008-03-01
ID105 2007-12-01 2008-06-01 2008-04-01
ID105 2007-12-01 2008-06-01 2008-05-01
極端なファイルの最小値と最大値の間の間隔の月ごとに、行が作成されます。
また、このコードが利用可能なコンピューティング リソースの複数のコアに対応できるようにする方法についても学びたいと思います。OK、これは実際には最適化ではないことは認めますが、実行時間を短縮することも重要です。
ヨッケム