3

私は大きなdata.tableを持っています。各並列プロセスはそこから読み取り、データを処理し、はるかに小さい data.table を返します。大きな DT をすべてのプロセスにコピーしたくないのですが、パッケージ内の%dopar%関数をコピーする必要があるようです。foreach

オブジェクトをすべてのプロセス (ウィンドウ内) で共有する方法はありますか? つまり、 以外のパッケージを使用しますforeach

サンプルコード

library(doParallel)
cluster = makeCluster(4)
registerDoParallel(cluster)

M = 1e4 # make this larger 
dt = data.table(x = rep(LETTERS, M), y = rnorm(26*M))
res = foreach(trim = seq(0.6, 0.95, 0.05), .combine = rbind) %dopar% {
  dt[, .(trimmean = mean(y, trim = trim)), by = x][, trim := trim]
}

(並列を使用せずにdata.tableでこれを行うより良い方法には興味がありません。これは、サブプロセスが処理するすべてのデータを読み取る必要があるが、決して変更しないというケースを示すためです)

4

1 に答える 1

3

R はマルチスレッド化されていないため、並列ワーカーはさまざまな並列プログラミング パッケージのプロセスとして実装されます。プロセスの機能の 1 つは、そのメモリが他のプロセスから保護されていることです。そのため、プログラムは、メモリ マップ ファイルなど、異なるプロセス間でメモリを共有する特別なメカニズムを使用する必要があります。R にはそのようなメカニズムに対する直接の組み込みサポートがないため、異なるプロセス間で共有できるオブジェクトを作成できる「bigmemory」などのパッケージが作成されています。残念ながら、「data.table」パッケージはそのようなメカニズムをサポートしていないため、ご希望の方法はないと思います。

Posix オペレーティング システム (Mac OS X や Linux など) では、プロセスと fork された子プロセスの間でメモリを "読み取り専用" で共有できることに注意してください。もちろん、これは Windows では機能しません。

于 2016-03-06T15:05:06.643 に答える