ฉันพยายามที่จะเข้าใจว่าทำไมโปรแกรม 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()
);
ฉันมีสองคำถาม:
ผลลัพธ์ที่ต้องการของโปรแกรมนี้คืออะไร?
หากปราศจาก
.parallel()
ดูเหมือนว่านี่เป็นเพียงการแสดงผลsum(1+2+3+...)
ซึ่งหมายความว่าเพียง "ติด" ที่กระแสแรกใน flatMap ซึ่งทำให้รู้สึกเมื่อใช้คู่ขนานฉันไม่รู้ว่ามีพฤติกรรมที่คาดหวังหรือไม่ แต่ฉันเดาว่าจะเป็นอย่างใดอย่างหนึ่งที่มันแทรกซึม
n
ลำธารสายแรกหรือสายอื่นn
ๆ มันอาจแตกต่างกันเล็กน้อยขึ้นอยู่กับพฤติกรรมการ chunking / bufferingทำให้หน่วยความจำไม่เพียงพอคืออะไร ฉันพยายามทำความเข้าใจว่ากระแสเหล่านี้ถูกนำไปใช้อย่างไรภายใต้ประทุน
ฉันคาดเดาสิ่งที่บล็อกกระแสดังนั้นมันไม่เคยเสร็จสิ้นและสามารถกำจัดค่าที่สร้างขึ้นได้ แต่ฉันไม่ค่อยรู้ว่าสิ่งใดที่เรียงลำดับตามการประเมินและที่การบัฟเฟอร์เกิดขึ้น
แก้ไข:ในกรณีที่มีความเกี่ยวข้องฉันใช้ Java 11
Editt 2:เห็นได้ชัดว่าสิ่งเดียวกันที่เกิดขึ้นแม้สำหรับโปรแกรมที่ง่ายIntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
ดังนั้นจึงอาจจะต้องทำอย่างไรกับ lazyness ของมากกว่าlimit
flatMap