プロセス間の通信の場合、開始するのに楽しい場所の1つは、ヘルプページ?socketConnections
と「## Notrun:」とマークされたチャンク内のコードです。したがって、Rプロセスを開始して実行します
con1 <- socketConnection(port = 6011, server=TRUE)
このプロセスはサーバーとして機能し、特定のポートで情報をリッスンします。次に、2番目のRプロセスを開始し、次のように入力します。
con2 <- socketConnection(Sys.info()["nodename"], port = 6011)
プロセス2のcon2は、プロセス1のcon1とソケット接続を確立しました。con1に戻り、Rオブジェクトを書き出します。LETTERS
writeLines(LETTERS, con1)
con2でそれらを取得します。
readLines(con2)
したがって、ディスクに書き込むことなくプロセス間で通信しました。ここでは、いくつかの重要な概念も暗黙的に示されています。たとえば、ブロッキング接続と非ブロッキング接続についてです。コンピューターが接続されているネットワークを介してポートにアクセスできる場合は、同じマシンでの通信に限定されません。これが並列パッケージの基礎でありmakePSOCKcluster
、プロセス1が実際にsystem
並列パッケージのコマンドとスクリプトを使用してプロセス2を開始することに加えて、によって返されるオブジェクトmakePSOCKcluster
はサブセット化可能であるため、特定のタスクを解決するためのクラスター。原則として、スポーンされたノードが、スポーンを行ったノードとは無関係に相互に通信するように調整できます。
興味深い演習は、parallel
パッケージ内のフォークのようなコマンドを使用して同じことを行うことです(Windows以外の場合)。これの高レベルバージョンは、ヘルプページ?mcparallel
にあります。
p <- mcparallel(1:10)
q <- mcparallel(1:20)
# wait for both jobs to finish and collect all results
res <- mccollect(list(p, q))
しかし、これは下位レベルの友人(およびソースコードsendMaster
でピーク)の上に構築されています。mcparallel
mccollect
RmpiパッケージはPSOCK
、マネージャーがスクリプトを使用してワーカーを生成し、ソケットではなくmpiを使用して通信する例のようなアプローチを採用しています。ただし、MPI実装が機能している場合は、週末のプロジェクトに値する別のアプローチは、異なるデータに対して同じ計算を実行し、、、、、などのコマンドを使用して結果を単一のノードに照合するスクリプトを実装するmpi.comm.rank
ことmpi.barrier
です。mpi.send.Robj
mpi.recv.Robj
楽しい週末のプロジェクトでは、並列パッケージを使用して、並列計算を含むがmclapplyの種類ではないワークフローを実装します。たとえば、あるプロセスがWebサイトからデータを収集し、それを別のプロセスに渡してきれいな絵を描きます。最初のプロセスへの入力はJSONである可能性がありますが、R内の通信はおそらくRデータオブジェクトの方がはるかに適切です。