Saya mencoba untuk memahami mengapa program Java berikut memberikan OutOfMemoryError
, sedangkan program yang sesuai .parallel()
tidak.
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()
);
Saya punya dua pertanyaan:
Apa output yang diinginkan dari program ini?
Tanpa
.parallel()
itu tampaknya ini hanya outputsum(1+2+3+...)
yang berarti bahwa itu hanya "macet" pada aliran pertama di flatMap, yang masuk akal.Dengan paralel, saya tidak tahu apakah ada perilaku yang diharapkan, tetapi dugaan saya adalah bahwa entah bagaimana hal itu menyisipkan aliran pertama
n
atau lebih, di manan
jumlah pekerja paralel. Bisa juga sedikit berbeda berdasarkan perilaku chunking / buffering.Apa yang menyebabkannya kehabisan memori? Saya secara khusus mencoba memahami bagaimana aliran ini diterapkan di bawah tenda.
Saya menduga sesuatu memblokir aliran, sehingga tidak pernah selesai dan dapat menghilangkan nilai yang dihasilkan, tapi saya tidak tahu di mana urutan hal-hal dievaluasi dan di mana buffering terjadi.
Sunting: Dalam kasus yang relevan, saya menggunakan Java 11.
Editt 2: Rupanya hal yang sama terjadi bahkan untuk program yang sederhana IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
, jadi itu mungkin ada hubungannya dengan kemalasan limit
daripada flatMap
.