this SO thread में, मैंने सीखा कि एक बड़े संग्रह पर seq
का संदर्भ रखने से पूरे संग्रह को कचरा-संग्रह से रोका जा सकेगा।क्लोजर में 'seq` का उपयोग करने से मुझे कब बचना चाहिए?
पहला, वह धागा 200 9 से है। क्या यह अभी भी "आधुनिक" क्लोजर (v1.4.0 या v1.5.0) में सच है?
दूसरा, क्या यह समस्या आलसी दृश्यों पर भी लागू होती है? उदाहरण के लिए, (def s (drop 999 (seq (range 1000))))
कचरा कलेक्टर को अनुक्रम के पहले 999
तत्वों को सेवानिवृत्त करने की अनुमति देगा?
आखिरकार, बड़े संग्रह के लिए इस मुद्दे के आसपास एक अच्छा तरीका है? दूसरे शब्दों में, अगर मेरे पास 10 लाख तत्वों का वेक्टर था, तो क्या मैं वेक्टर को इस तरह से उपभोग कर सकता हूं कि खपत वाले हिस्सों को कचरा इकट्ठा किया जा सकता है? अगर मेरे पास 10 मिलियन तत्वों के साथ हैशपैप था तो क्या होगा?
कारण मैं पूछता हूं कि मैं काफी बड़े डेटा सेट पर काम कर रहा हूं, और मुझे वस्तुओं के संदर्भों को बनाए रखने के लिए और अधिक सावधान रहना होगा, ताकि जिन वस्तुओं की मुझे आवश्यकता नहीं है उन्हें कचरा इकट्ठा किया जा सकता है। जैसा कि है, मुझे कुछ मामलों में java.lang.OutOfMemoryError: GC overhead limit exceeded
त्रुटि का सामना करना पड़ रहा है।
मुझे लगता है कि @ cgrand का उदाहरण '(ड्रॉप 99 99 0 9 (वीसीसी (1000000)) ड्रॉप करें) 'हस्तक्षेप करने वाले वेक्टर और' subvec'toring के व्यवहार के कारण है। मुझे कोई आलसी नहीं है कि एक आलसी 'विपक्ष अनुक्रम ऐसा करेगा। यदि आपको एक उपवर्गक बनाए रखने के दौरान एक वेक्टर जारी करने की आवश्यकता है, तो आप सबवेक्टर को 'नए वेक्टर' में कॉपी कर सकते हैं। हालांकि, बहुत दिलचस्प सवाल है, मैं जवाब भी देखने का इंतजार कर रहा हूं! –