2

テストデータセット(n = 35000)を分割し、Rをより小さなチャンクで実行できるようにすることで、テストデータセット(n = 35000)の予測を高速化しようとしています。モデルはで生成されていparty::cforestます。

foreachただし、で使用しようとすると、Rで最小のパーツを計算することはできません%dopar%

predict(fit,newdata=a[1:100,])私の予測関数は、との両方で約7秒かかります foreach(i=1:10) %do% {predict(fit,newdata=a[1:10,])}

しかし、%dopar%代わりに使用しようとすると、Rがフリーズするようです。すべきではない:

foreach(i=1:10, .packages=c('party')) %dopar% {predict(fit,newdata=a[1:10,])}

ずっと速くなりますか?それとも、並列化自体がRの速度を低下させているのでしょうか。

別の関数(ここで提案されているようにsqrt(3)を繰り返し計算する)を使用したテスト実行では、大幅な改善が見られたため、%dopar%も機能しています。

randomForestを使用した予測も同様に動作しますが、ここで%do%は10x1:10の予測でも、1:100を予測するよりもはるかに時間がかかるという違いがあります。randomForestの場合、35kのデータセットすべてを予測することは問題ではないため、私はあまり気にしません。ところで。それは私だけですか、それともcforestはすべてにもっと時間とRAMを費やしていますか?randomForestがチャームのように機能する場合にのみ問題が発生します。

(Windows 7、x64、8GB RAM、4コア/ 8スレッドで実行-doSNOW並列化クラスターで6ノードを使用)

4

1 に答える 1

0

aこの例の主な問題は、foreachがデータフレーム全体を各ワーカーに自動的にエクスポートすることです。代わりに、次のようなものを試してください。

library(itertools)
foreach(1:10, suba=isplitRows(a, chunkSize=10), .packages='party') %dopar% {
    predict(fit, newdata=suba)
}

これ1:10はテスト目的であり、例で行っているように、ループを10回の反復のみに制限します。

これでもfit、すべてのワーカーにエクスポートする必要があり、かなり大きくなる可能性があります。ただし、ワーカーよりも多くのタスクがありpredict、テストデータの送信に比べて十分な時間がかかる場合は、予測を並列化する価値があるかもしれません。

于 2013-03-14T18:34:56.943 に答える