2011-12-19 14 views
12

जैसा कि मैं समझता हूं, Stream हाल ही में मूल्यांकन किए गए तत्वों को बरकरार रखता है। मुझे लगता है कि यह सभी मूल्यांकन तत्वों को बनाए रखता नहीं है (यह व्यवहार्य नहीं है), इसलिए यह शायद कुछ आंतरिक "कैश" का उपयोग करता है।स्कैला स्ट्रीम और उनकी मेमोरी उपयोग

क्या यह सही है? क्या मैं इस कैश के आकार और नीतियों को नियंत्रित कर सकता हूं?

+1

आपको 'स्ट्रीम की 'Iterator' के रूप में नहीं सोचना चाहिए, बल्कि 'सूची' के रूप में नहीं होना चाहिए जिसका मूल्यांकन देरी हो सकती है। [यह प्रश्न और इसके उत्तर] (http://stackoverflow.com/questions/1527962/difference-between-iterator-and-stream-in-scala) मदद कर सकता है। – Philippe

उत्तर

6

स्ट्रीम-ऑब्जेक्ट उन सभी संदर्भों को बरकरार रखता है जिनका मूल्यांकन/उपयोग किया गया है। StreamList जैसा काम करता है। प्रत्येक तत्व जिसे किसी संदर्भ संदर्भ से पहुंचा जा सकता है, और जिसे कम से कम एक बार पहले से ही एक्सेस किया जा चुका है, कचरा नहीं होगा।

तो मूल रूप से स्ट्रीम में आपके पॉइंटर्स और आपने जो मूल्यांकन किया है, उसे अब तक परिभाषित किया गया है कि कैश किया जाएगा।

+0

तो, 'स्ट्रीम' में इसके तत्वों को संग्रहीत करने के लिए _limited_ मेमोरी कैश नहीं है। बहुत स्मृति-उपभोग करने वाले दृष्टिकोण की तरह लगता है ... – Michael

+1

यही कारण है कि आपको किसी भी स्ट्रीम के संदर्भ में _never_ रखना चाहिए। हमेशा 'def' का उपयोग करके उन्हें परिभाषित करें। यह भी देखें http://stackoverflow.com/questions/12486762/scala-tail-recursive-stream-processor- कार्यक्षमता- परिभाषित-in-trait-holds-reference और http://stackoverflow.com/questions/12529697/how- टू-राइट-गैर-लीकिंग-पूंछ-रिकर्सिव-फ़ंक्शन-उपयोग-स्ट्रीम-कंस-इन-स्कैला – ron

12

स्ट्रीम सूचियों की तरह हैं जो उनके सदस्यों को आवश्यकतानुसार उत्पन्न करते हैं। एक बार तत्व उत्पन्न हो जाने के बाद, इसे स्ट्रीम में रखा जाता है और पुन: उपयोग किया जाता है।

उदाहरण के लिए:

lazy val naturals: Stream[Int] = Stream.cons(0, naturals.map{_ + 1}) 

आप प्राकृतिक संख्या की एक धारा दे देंगे। अगर मैं

naturals(5) 

फोन यह तत्व 0-5 पैदा करते हैं और वापस जाने के 5 होगा, अगर मैं तो फोन

naturals(8) 

यह पहली बार 6 तत्वों का पुन: उपयोग और 3 अधिक उत्पन्न होगा।

यदि आप स्मृति उपयोग के बारे में चिंतित हैं, तो आप Stream.drop(num) का उपयोग num तत्वों के साथ शुरू से हटाए गए तत्वों के साथ कर सकते हैं, जिससे पुराने समूह के साथ कटा हुआ तत्व कचरा हो सकता है। उदाहरण के लिए:

naturals(5) //returns 5 
val truncated = naturals.drop(4) 
truncated(5) //returns 9 
+6

हालांकि, जब तक 'प्राकृतिक' अभी भी स्ट्रीम के प्रमुख को इंगित कर रहा है, तो पहले पांच तत्व कचरे नहीं होंगे एकत्र किया हुआ। –

संबंधित मुद्दे