次のコードで while ループを並列化したい:
work <- function(n) {
# Do some intensive work (e.g explore a graph starting at n).
# After this, we don't need to execute work() on nodes in excluding.
# (e.g exclude could be the nodes explored/reached from n)
# n is just an example. exclude can be a potentially large set.
Sys.sleep(2)
exclude <- c(n, sample(nodes, rbinom(1, length(nodes), 0.5)))
return(exclude)
}
nodes <- 1:1e3
#Order of execution doesn't matter
nodes <- sample(nodes)
#parallelize this loop
while(length(nodes) > 0) {
n <- nodes[1]
exclude <- work(n)
nodes <- setdiff(nodes, exclude)
}
が除外されたノードで実行されるかどうかは問題ではありませんがwork()
、そのようなインスタンスを最小限に抑えたいと考えています。上記の while ループの目的は、work() の実行回数をできるだけ少なくすることです。
parLapply
これは恥ずかしいほどの並列計算ではないので、直接使用する方法がわかりません。マスター/スレーブ フレームワークを使用することもできますが、マルチコア プログラミング (Windows 上) については知りません。
具体的な例として、 ( が接続されているすべてのノードを検索する関数) および n の接続コンポーネント内のノードと考えることwork(n)
がgraph_exploration(n)
できn
ますexclude
。最終的な目的は、各連結要素から 1 つのノードを見つけることです。graph_exploration(n)
コストのかかる操作であるため、必要な回数だけ実行する必要があります。