मैं यह समझने की कोशिश कर रहा हूं कि निम्नलिखित जावा प्रोग्राम एक क्यों देता है 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+...)
का मतलब है कि इसका मतलब यह है कि फ्लैटप्लस में पहली धारा पर "अटक जाता है", जो समझ में आता है।समानांतर के साथ मुझे नहीं पता कि क्या एक अपेक्षित व्यवहार है, लेकिन मेरा अनुमान है कि यह किसी भी तरह से पहले
n
या तो धाराओं को वर्गीकृत करता है, जहांn
समानांतर श्रमिकों की संख्या है। यह चंकिंग / बफरिंग व्यवहार के आधार पर थोड़ा अलग भी हो सकता है।क्या यह स्मृति से बाहर चलाने का कारण बनता है? मैं विशेष रूप से यह समझने की कोशिश कर रहा हूं कि इन धाराओं को हुड के तहत कैसे लागू किया जाता है।
मैं अनुमान लगा रहा हूं कि कुछ धारा को अवरुद्ध करता है, इसलिए यह कभी खत्म नहीं होता है और उत्पन्न मूल्यों से छुटकारा पाने में सक्षम है, लेकिन मुझे यह नहीं पता है कि किन चीजों का मूल्यांकन किया जाता है और जहां बफरिंग होती है।
संपादित करें: यदि यह प्रासंगिक है, तो मैं जावा 11 का उपयोग कर रहा हूं।
एडिट 2: जाहिर तौर पर सिंपल प्रोग्राम के लिए भी यही होता है IntStream.iterate(1,i->i+1).limit(1000_000_000).parallel().sum()
, इसलिए इसके limit
बजाय आलस के साथ करना पड़ सकता है flatMap
।