最初に、重要な注意:すべてのデータをコピーする必要があるため、.par
on を使用しないでください (シーケンシャルにしか読み取れないため)。代わりに、コピーせずに変換できるのようなものを使用してください。List
List
Vector
.par
並列処理を間違った方法で考えているようです。何が起こるかは次のとおりです。
次のようなファイルがある場合:
0
1
2
3
4
5
6
7
8
9
そして機能f
とg
:
def f(line: String) = {
println("running f(%s)".format(line))
line.toInt
}
def g(n: Int) = {
println("running g(%d)".format(n))
n + 1
}
次に、次のことができます。
io.Source.fromFile("data.txt").getLines.toIndexedSeq[String].par.map(l => g(f(l)))
出力を取得します。
running f(3)
running f(0)
running f(5)
running f(2)
running f(6)
running f(1)
running g(2)
running f(4)
running f(7)
running g(4)
running g(1)
running g(6)
running g(3)
running g(5)
running g(0)
running g(7)
running f(9)
running f(8)
running g(9)
running g(8)
したがって、g(f(l))
操作全体が同じスレッドで行われている場合でも、各行が並行して処理される可能性があることがわかります。したがって、多くのf
andg
操作が別々のスレッドで同時に発生する可能性がありますが、特定の行f
のandは順番に発生します。g
結局のところ、行を読み取り、f
を実行g
し、並行して実行する方法は実際には存在しないため、これは想定どおりの方法です。たとえば、行がまだ読み取られていない場合、g
出力に対してどのように実行できますか?f