Aşağıdaki Java programının neden verdiğini anlamaya çalışıyorum OutOfMemoryError
, karşılık .parallel()
gelmeyen program yok.
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()
);
İki sorum var:
Bu programın amaçlanan çıktısı nedir?
Olmadan
.parallel()
öyle görünüyor ki bu basitçe çıkışlarısum(1+2+3+...)
sadece mantıklı flatMap ilk akışının en "takılıp alır" anlamına gelir söyledi.Paralel olarak, beklenen bir davranış olup olmadığını bilmiyorum, ama tahminim, bir şekilde ilk
n
ya da çok akışları bir araya getirdin
, paralel işçi sayısı nerede . Parçalama / tamponlama davranışına bağlı olarak biraz farklı olabilir.Bellek yetersiz kalmasına ne sebep olur? Özellikle bu akışların başlık altında nasıl uygulandığını anlamaya çalışıyorum.
Sanırım bir şey akışı engeller, bu yüzden asla bitmez ve üretilen değerlerden kurtulabilir, ancak şeylerin hangi sırayla değerlendirildiğini ve tamponlamanın nerede gerçekleştiğini bilmiyorum.
Düzenleme: İlgili olması durumunda, Java 11 kullanıyorum.
Editt 2: Görünüşe göre aynı şey basit program için bile olur IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
, bu yüzden limit
yerine tembellik ile ilgili olabilir flatMap
.