मेरी वर्तमान परियोजना में मैं काफी बड़ी मात्रा में डेटा संसाधित कर रहा हूं और डेटा की प्रसंस्करण दोनों मेमोरी कुशल और कम्प्यूटेशनल रूप से प्रदर्शन करने वाली होनी चाहिए। प्रत्येक आइटम में कुछ मेटा-डेटा होते हैं जिन्हें बहुत तेज़ पढ़ा जा सकता है और लगभग हमेशा दिलचस्प होता है। इसके अतिरिक्त प्रत्येक आइटम में वास्तविक डेटा होता है जो तुलनात्मक रूप से शायद ही कभी पढ़ा जाता है लेकिन पढ़ने और विशेष रूप से पार्सिंग बहुत समय ले रहा है। इसलिए यह प्राकृतिक रूप से seams है कि डेटा की पार्सिंग केवल तभी किया जाना चाहिए जब वास्तव में अनुरोध किया जाता है।कचरा मूल्यों के बाद वस्तुओं को इकट्ठा किया गया है
class Item(metaData: MetaData, dataString: String) {
lazy val data = parse(dataString)
}
अब डेटा केवल पार्स किया गया है, तो यह वास्तव में अनुरोध किया जाता है:
उस उद्देश्य मैं आलसी मूल्यों की सोच रहा था के लिए। समस्या अब है, कि डेटास्ट्रिंग और पार्स किए गए डेटा को स्मृति में रखा जाता है। जहां तक मैं देख सकता हूं, "डेटास्ट्रिंग" को अब तक "डेटा" कहा जा सकता है (या वहां है?) और इसे कचरा इकट्ठा किया जा सकता है। दुर्भाग्यवश यह सीम खुश नहीं है।
क्या समस्या को हल करने का कोई तरीका है या कचरा कलेक्टर को कचरा देने का संकेत देने के लिए यहां डेटा एकत्र करना है?
class Item(dataString: String) {
private var storedData = dataString
lazy val data = {
val temp = parse(storedData)
storedData = null
temp
}
}
dataString
के लिए एक अतिरिक्त संदर्भ नहीं रखा जाता है क्योंकि आप कभी नहीं निर्माता (जो सेट storedData
) के बाहर यह उल्लेख करने के लिए, और संदर्भ आप में स्टोर:
यकीन है कि यद्यपि .. 'कोशिश वर्ग मद (मेटाडाटा: मेटाडाटा, वैल dataString: स्ट्रिंग)' यह काम करता है, तो .. – Shrey
यह निश्चित रूप काम नहीं करेगा क्योंकि '' dataString' Item' के एक सार्वजनिक क्षेत्र तो है । – Zwackelmann
अच्छी तरह से .. क्योंकि आपके पास आपकी कक्षा में 'डेटास्ट्रिंग' का उदाहरण होगा .. आप' वर्ग आइटम (मेटाडेटा: स्ट्रिंग, निजी वैल डेटास्ट्रिंग: स्ट्रिंग) भी आज़मा सकते हैं। – Shrey