次のJavaプログラムがを提供する理由を理解しようとしていますがOutOfMemoryError
、対応するプログラムなしで.parallel()
は対応していません。
System.out.println(Stream
.iterate(1, i -> i+1)
.parallel()
.flatMap(n -> Stream.iterate(n, i -> i+n))
.mapToInt(Integer::intValue)
.limit(100_000_000)
.sum()
);
2つの質問があります。
このプログラムの意図する出力は何ですか?
これがない
.parallel()
場合、これは単純に出力するように見えますsum(1+2+3+...)
。つまり、flatMapの最初のストリームで単に「行き詰まる」ということです。これは理にかなっています。並列では、予想される動作があるかどうかはわかりませんが、それは何らかの形で最初の
n
ストリームをインターリーブしたと思われます。ここn
で、並列ワーカーの数です。また、チャンク/バッファリングの動作に基づいて少し異なる場合もあります。メモリが不足する原因は何ですか?具体的には、これらのストリームが内部でどのように実装されるかを理解しようとしています。
何かがストリームをブロックしていると思うので、ストリームが終了せず、生成された値を取り除くことができますが、評価の順序とバッファリングが発生する場所がわかりません。
編集:必要に応じて、Java 11を使用しています。
Editt 2:どうやら同じことは単純なプログラムIntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
でも発生するので、limit
ではなくの怠惰に関係している可能性がありflatMap
ます。