4

次のコードで 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)コストのかかる操作であるため、必要な回数だけ実行する必要があります。

4

1 に答える 1