私は最近、プロジェクトでRの並列手法を使用し始めて、- parallel パッケージの mclapply を使用してLinuxシステムでプログラムを動作させています。しかし、私はWindowsのparLapply
を理解しているため、大きな障害に直面しました。
mclapply
を使用すると、コアと反復の数を設定し、それをワークスペースの既存の関数に渡すことができます。
_mclapply(1:8, function(z) adder(z, 100), mc.cores=4)
_
parLapply
を使用してWindowsで同じことを行うことができないようです。私が理解しているように、clusterExport()
を使用してすべての変数を渡し、引数に適用する実際の関数を渡す必要があります。
これは正しいですか、またはWindowsに適用できるmclapply
関数に似たものがありますか?
mclapply
の優れている点は、mclapply
が呼び出された時点でワーカープロセスがすべてマスターのクローンとして作成されるため、各クラスターワーカーで環境を再現する必要がないということです。残念ながら、これはWindowsでは不可能です。
parLapply
を使用する場合、通常、次の追加手順を実行する必要があります。
また、完了したら、stopCluster
を使用してPSOCKクラスターをシャットダウンすることをお勧めします。
ここにあなたの例のparLapply
への翻訳があります:
library(parallel)
cl <- makePSOCKcluster(4)
setDefaultCluster(cl)
adder <- function(a, b) a + b
clusterExport(NULL, c('adder'))
parLapply(NULL, 1:8, function(z) adder(z, 100))
adder
関数でパッケージが必要な場合は、parLapply
で呼び出す前に、各ワーカーでそのパッケージをロードする必要があります。 clusterEvalQ
を使用すると、非常に簡単にこれを行うことができます。
clusterEvalQ(NULL, library(MASS))
NULL
、clusterExport
、clusterEval
へのparLapply
の最初の引数は、setDefaultCluster
を介して登録されたクラスターオブジェクトを使用する必要があることを示しています。プログラムがmclapply
を使用するようにプログラムを変換するときに、クラスターオブジェクトを必要とするすべての関数にクラスターオブジェクトを渡す必要がないように、プログラムがparLapply
を使用している場合に非常に役立ちます。
もちろん、adder
が他の関数を呼び出すグローバル環境の他の関数を呼び出すこともあります。その場合、それらもエクスポートし、必要なパッケージをロードする必要があります。また、エクスポートした変数がプログラムの途中で変更された場合、クラスターワーカーでそれらを更新するために、変数を再度エクスポートする必要があります。繰り返しになりますが、mclapply
では、ワーカーが呼び出されるたびに常にワーカーが作成/クローン/フォークされるため、不要です。
mclapplyは使いやすく、基盤となるオペレーティングシステムのfork()機能を使用して並列化を実現します。ただし、Windowsにはfork()がないため、代わりに標準のlapplyが実行され、並列化は行われません。
parLapplyは別の獣です。プロセスのクラスターを作成します。これはネットワーク上の異なるマシンに存在することもでき、タスクと結果を相互に渡すためにTCP/IPを介して通信します。
コードの問題は、parLapplyの最初のパラメーターが「クラスター」オブジェクトであることを認識していないことです。 parLapplyを使用して単一のマシンで実行する最も簡単な例は、次のとおりです。
library(parallel)
# Spawn child processes using fork() on the local machine
cl <- makeForkCluster(getOption("cl.cores", 2))
# Use parLapply to calculate lengths of 1000 strings
text = rep("Hello, world!", 1000)
len = parLapply(cl, text, nchar)
# Kill child processes since they are no longer needed
stopCluster(cl)
上記のようにmakeForkClusterを使用して作成されたクラスターでparLapplyを使用することは、mclapplyを呼び出すことと機能的に同等です。したがって、Windowsでも機能しません。 :)ドキュメントでmakeClusterとmakePSOCKclusterを使用してクラスターを作成できる他の方法を見て、要件に最適な方法を確認してください。