scala では、アイテムの並列 Iterable があり、それらを反復処理して、何らかの方法で結果を集計したいと考えていますが、順序どおりです。ユース ケースを単純化して、整数の Iterable から始めて、それらの文字列表現を並列に連結し、結果を順番に並べたいとします。
これは、折り畳みまたは集約のいずれかで可能ですか? ドキュメントからは、どのメソッドが並列化されて機能するが順序を維持するかは不明です。
scala では、アイテムの並列 Iterable があり、それらを反復処理して、何らかの方法で結果を集計したいと考えていますが、順序どおりです。ユース ケースを単純化して、整数の Iterable から始めて、それらの文字列表現を並列に連結し、結果を順番に並べたいとします。
これは、折り畳みまたは集約のいずれかで可能ですか? ドキュメントからは、どのメソッドが並列化されて機能するが順序を維持するかは不明です。
はい、並列コレクションでの折り畳み/集約/削減操作の順序が保持されることが保証されています。これは十分に文書化されていません。秘訣は、折り畳む操作が結合的 (したがって、任意に分割および再結合できる) である必要がありますが、交換可能である必要はない (したがって、安全に並べ替えることができない) ことです。文字列の連結は、連想的で交換不可能な操作の完璧な例であるため、折り畳みを並行して行うことができます。
val concat = myParallelList.map(_.toString).reduce(_+_)
折り畳みの場合:並列foldRight
でfoldLeft
処理できない場合は、新しい方法を使用する必要があります(fold
詳細はこちら)。
のようfold
に、aggregate
その作業を並行して行うことができます。「異なるパーティション内の要素を順番にトラバースします」(Scaladoc)。
Odersky の出版物 (http://infoscience.epfl.ch/record/150220) に従って並列コレクションが実装される方法により、Jean-Philippe Pellets の回答へのコメントという意味での「順序」の維持が保証されると思います。 /files/pc.pdf)コレクションを分割する部分が順序に関して適切に動作している場合。
つまり、要素 a < b < c があり、a と c が 1 つのパーティションに収まる場合、b も同じパーティションにあることになります。
分割の原因となった部分が正確には覚えていませんが、それが見つかった場合は、そのドキュメントまたはソース コードに質問に答えるのに十分な情報が含まれている可能性があります。