collection.parallel.mutable.ParHashMap (または他の並列コレクション)の非常に大きなインスタンスが与えられた場合、特定の、たとえば50の一致数が見つかったら、どのようにしてフィルタリング並列スキャンを中止できますか?
スレッドセーフな「外部」データ構造に中間一致を蓄積しようとしたり、結果カウントを含む外部AtomicIntegerを維持したりすることは、通常のcollection.mutable.HashMapを使用して単一コアを100にペギングするよりも、4コアで2〜3倍遅いようです。%。
Par *コレクションの検索または存在は、「内部」で中止されることを認識しています。これを一般化して複数の結果を見つける方法はありますか?
これは、ParHashMapで約79,000エントリの場合でも2〜3倍遅いように見え、maxResultsの結果よりも多くの結果を結果のCHMに詰め込むという問題もあります(これはおそらく、incrementAndGetの後、 breakの前にスレッドがプリエンプトされたためです)他のスレッドが要素を追加できるようにします)。更新:速度の低下は、counter.incrementAndGet()で競合するワーカースレッドが原因であるようです。これはもちろん、並列スキャン全体の目的を無効にします:-(
def find(filter: Node => Boolean, maxResults: Int): Iterable[Node] =
{
val counter = new AtomicInteger(0)
val results = new ConcurrentHashMap[Key, Node](maxResults)
import util.control.Breaks._
breakable
{
for ((key, node) <- parHashMap if filter(node))
{
results.put(key, node)
val total = counter.incrementAndGet()
if (total > maxResults) break
}
}
results.values.toArray(new Array[Node](results.size))
}