ここには 2 つの問題があります。並列コレクションを格納するために必要なメモリ量と、並列コレクションを「通過」するために必要なメモリ量です。
違いは、次の 2 つの行で確認できます。
(1 to 1000000).map(_+3).toList
(1 to 1000000).par.map(_+3).toList
REPL は評価された式を保存します。覚えておいてください。私の REPL では、メモリが不足する前に、これらの両方を 7 回実行できます。並列実行を介して渡すと、一時的に余分なメモリが使用されますが、toList が実行されると、その余分な使用量はガベージ コレクションされます。
(1 to 100000).par.map(_+3)
ParSeq[Int] (この場合は ParVector) を返します。これは、通常のベクターよりも多くのスペースを占有します。これは、メモリが不足する前に 4 回実行できますが、これは実行できます。
(1 to 100000).map(_+3)
メモリがなくなる前に11回。したがって、並列コレクションを保持すると、より多くのスペースが必要になります。
回避策として、返す前に のような単純なコレクションに変換できList
ます。
並列コレクションがなぜこれほど多くのスペースを占有するのか、なぜ多くのものへの参照を保持するのかについては、私にはわかりませんがviews
[*]、それが問題だと思われる場合は問題を提起してください。
[*] 確たる証拠なし。