web-dev-qa-db-ja.com

Rがより多くのCPUとメモリを使用するようにするにはどうすればよいですか?

Rの計算がどれほど集中していても、CPUの25%以上を使用しません。 rsession.exeの優先度をHighRealtimeに設定してみましたが、使用方法は同じです。 RのCPU使用率を増やしてシステムの可能性を最大限に活用する方法はありますか、または問題の理解に誤解がありますか?助けてくれてありがとう。

PS:以下はCPU使用率のスクリーンショットです。 Screenshot of the CPU usage

13
Suraj

ベースRはシングルスレッドなので、使用量の25%は4コアCPUで予想されます。単一のWindowsマシンでは、parallelパッケージとforeachパッケージ。

まず、並列パッケージ(R 2.8.0以降に含まれ、インストールする必要はありません)は、snowパッケージに基づく関数を提供します-これらの関数はlapply()の拡張です。そしてforeachパッケージはforループ構造の拡張を提供します-doParallelパッケージで使用する必要があることに注意してください。

以下は、両方のパッケージを使用したk-meansクラスタリングの簡単な例です。アイデアは単純です。つまり、(1)各クラスターにkmeans()をフィッティングし、(2)結果を組み合わせて、(3)最小のtot.withinessを選択します。

library(parallel)
library(iterators)
library(foreach)
library(doParallel)

# parallel
split = detectCores()
eachStart = 25

cl = makeCluster(split)
init = clusterEvalQ(cl, { library(MASS); NULL })
results = parLapplyLB(cl
                      ,rep(eachStart, split)
                      ,function(nstart) kmeans(Boston, 4, nstart=nstart))
withinss = sapply(results, function(result) result$tot.withinss)
result = results[[which.min(withinss)]]
stopCluster(cl)

result$tot.withinss
#[1] 1814438

# foreach
split = detectCores()
eachStart = 25
# set up iterators
iters = iter(rep(eachStart, split))
# set up combine function
comb = function(res1, res2) {
  if(res1$tot.withinss < res2$tot.withinss) res1 else res2
}

cl = makeCluster(split)
registerDoParallel(cl)
result = foreach(nstart=iters, .combine="comb", .packages="MASS") %dopar%
  kmeans(Boston, 4, nstart=nstart)
stopCluster(cl)

result$tot.withinss
#[1] 1814438

これらのパッケージの詳細とその他の例については、次の投稿をご覧ください。

16
Jaehyeon Kim

Rは、ほとんどの場合、シングルスレッドです。適切に設定しない限り、1コアから100%まで使用します。私の推測では、クアッドコアマシンを使用しているため、100%の1コアは25%のCPU使用率のように見えます。

2
Taylor