2013-04-27 10 views
5

मेरी वर्तमान परियोजना में मैं काफी बड़ी मात्रा में डेटा संसाधित कर रहा हूं और डेटा की प्रसंस्करण दोनों मेमोरी कुशल और कम्प्यूटेशनल रूप से प्रदर्शन करने वाली होनी चाहिए। प्रत्येक आइटम में कुछ मेटा-डेटा होते हैं जिन्हें बहुत तेज़ पढ़ा जा सकता है और लगभग हमेशा दिलचस्प होता है। इसके अतिरिक्त प्रत्येक आइटम में वास्तविक डेटा होता है जो तुलनात्मक रूप से शायद ही कभी पढ़ा जाता है लेकिन पढ़ने और विशेष रूप से पार्सिंग बहुत समय ले रहा है। इसलिए यह प्राकृतिक रूप से 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) के बाहर यह उल्लेख करने के लिए, और संदर्भ आप में स्टोर:

+0

यकीन है कि यद्यपि .. 'कोशिश वर्ग मद (मेटाडाटा: मेटाडाटा, वैल dataString: स्ट्रिंग)' यह काम करता है, तो .. – Shrey

+0

यह निश्चित रूप काम नहीं करेगा क्योंकि '' dataString' Item' के एक सार्वजनिक क्षेत्र तो है । – Zwackelmann

+0

अच्छी तरह से .. क्योंकि आपके पास आपकी कक्षा में 'डेटास्ट्रिंग' का उदाहरण होगा .. आप' वर्ग आइटम (मेटाडेटा: स्ट्रिंग, निजी वैल डेटास्ट्रिंग: स्ट्रिंग) भी आज़मा सकते हैं। – Shrey

उत्तर

7

तुम बस थोड़ा और अधिक टूलींग की जरूरत है एक बार जब आप इसका इस्तेमाल करते हैं तो storedData बाहर निकल जाता है, इसलिए स्ट्रिंग तब जीसीड होने के लिए स्वतंत्र होती है।

5

कारण यह कभी कचरा एकत्र नहीं किया जाता है क्योंकि स्कैला एक निजी क्षेत्र में dataString स्टोर करता है, इसलिए आलसी फ़ंक्शन का मूल्यांकन बाद में किया जा सकता है, इसलिए यह हमेशा के लिए dataString पर रहता है। यदि आलसी मूल्यांकन एक अलग बंद होने पर हुआ, तो यह कोई समस्या नहीं होगी, लेकिन यह केवल एक सादा वर्ग विधि है, इसलिए dataString तब तक आयोजित किया जाता है जब तक कक्षा का उदाहरण होता है।

आप कक्षा को संकलित और अलग करके इसे देख सकते हैं।

class Item(dataString: String) { 
    lazy val data = parse(dataString) 


    def parse(s: String) = s.reverse 

} 

disassembly पता चलता है, एक अंतिम निजी क्षेत्र dataString बनाई गई है जो निर्माता में संग्रहित है। आलसी मूल्यांकन data$lzycompute विधि में होता है जो मान dataString लेता है, उस पर गणना करता है, और परिणाम data फ़ील्ड में संग्रहीत करता है। लेकिन dataString अभी भी इसका मूल मूल्य रखता है।

यह भी आलसी समारोह का मूल्यांकन किया गया है या नहीं, पर नज़र रखने के लिए एक क्षेत्र bitmap$0 को परिभाषित करता है, और एक आवरण एक्सेसर सदस्य भी data जो यदि आवश्यक हो तो फ़ंक्शन को कॉल करने और उसके बाद क्षेत्र data रिटर्न कहा जाता है।

.version 50 0 
.class super public Item 
.super java/lang/Object 
.runtimevisible annotation Lscala/reflect/ScalaSignature; 
    bytes = string [_7] 
.end annotation 
.attribute ScalaSig '\x05\x00\x00' 

.field final private dataString Ljava/lang/String; 
.field private data Ljava/lang/String; 
.field volatile private bitmap$0 Z 

.method private data$lzycompute :()Ljava/lang/String; 
    .limit stack 3 
    .limit locals 2 
    .catch [0] from L4 to L34 using L46 
    aload_0 
    dup 
    astore_1 
    monitorenter 
L4: 
    aload_0 
    getfield Item bitmap$0 Z 
    ifne L28 
    aload_0 
    aload_0 
    aload_0 
    getfield Item dataString Ljava/lang/String; 
    invokevirtual Item parse (Ljava/lang/String;)Ljava/lang/String; 
    putfield Item data Ljava/lang/String; 
    aload_0 
    iconst_1 
    putfield Item bitmap$0 Z 
L28: 
.stack append 
    locals Object Item 
.end stack 
    getstatic scala/runtime/BoxedUnit UNIT Lscala/runtime/BoxedUnit; 
    pop 
    aload_1 
    monitorexit 
L34: 
    aload_0 
    aconst_null 
    pop 
    aconst_null 
    putfield Item dataString Ljava/lang/String; 
    aload_0 
    getfield Item data Ljava/lang/String; 
    areturn 
L46: 
.stack same_locals_1_stack_item 
    stack Object java/lang/Throwable 
.end stack 
    aload_1 
    monitorexit 
    athrow 
.end method 

.method public data :()Ljava/lang/String; 
    .limit stack 1 
    .limit locals 1 
    aload_0 
    getfield Item bitmap$0 Z 
    ifeq L14 
    aload_0 
    getfield Item data Ljava/lang/String; 
    goto L18 
L14: 
.stack same 
    aload_0 
    invokespecial Item data$lzycompute()Ljava/lang/String; 
L18: 
.stack same_locals_1_stack_item 
    stack Object java/lang/String 
.end stack 
    areturn 
.end method 

.method public parse : (Ljava/lang/String;)Ljava/lang/String; 
    .limit stack 4 
    .limit locals 2 
    new scala/collection/immutable/StringOps 
    dup 
    getstatic scala/Predef$ MODULE$ Lscala/Predef$; 
    aload_1 
    invokevirtual scala/Predef$ augmentString (Ljava/lang/String;)Ljava/lang/String; 
    invokespecial scala/collection/immutable/StringOps <init> (Ljava/lang/String;)V 
    invokeinterface scala/collection/IndexedSeqOptimized reverse()Ljava/lang/Object; 1 
    checkcast java/lang/String 
    areturn 
.end method 

.method public <init> : (Ljava/lang/String;)V 
    .limit stack 2 
    .limit locals 2 
    aload_0 
    aload_1 
    putfield Item dataString Ljava/lang/String; 
    aload_0 
    invokespecial java/lang/Object <init>()V 
    return 
.end method 

.const [_7] = Utf8 '\x06\x01)2A!\x01\x02\x01\x0b\t!\x11\n^3n\x15\x05\x19\x11a\x02\x1ff[B$\x18PP\x02\x01\'\t\x01a\x01\x05\x02\x08\x195\t\x01B\x03\x02\n\x15\x05!A.\x198h\x15\x05Y\x11\x01\x026bm\x06L!!\x04\x05\x03\r=\x13\'.Z2u\x11!y\x01A!A!\x02\x13\x01\x12A\x033bi\x06\x1cFO]5oOB\x11\x11c\x06\x08\x03%Ui\x11a\x05\x06\x02)\x05)1oY1mC&\x11acE\x01\x07!J,G-\x1a4\n\x05aI"AB*ue&twM\x03\x02\x17\'!)1\x04\x01C\x019\x051A(\x1b8jiz""!H\x10\x11\x05y\x01Q"\x01\x02\t\x0b=Q\x02\x19\x01\t\t\x11\x05\x02\x01R1A\x05\x02\t\nA\x01Z1uCV\t\x01\x03\x03\x05%\x01!\x05\t\x15)\x03\x11\x03\x15!\x17\r^1!\x11\x151\x03\x01"\x01(\x03\x15\x01\x18M]:f)\t\x01\x02\x06C\x03*K\x01\x07\x01#A\x01t\x01' 
नहीं
संबंधित मुद्दे