2012-09-27 17 views
5

में मेमोरी मैनेजमेंट मुझे पर्ल में मेमोरी को संभालने का एक अजीब मुद्दा सामना करना पड़ रहा है। मैं एक पर्ल आवेदन में काम कर रहा हूं जो बहुत बड़े हैश-संरचनाओं का उपयोग करता है। मैं ऑब्जेक्ट्स को रेफरी कर रहा हूं और ऑब्जेक्ट कर रहा हूं। लेकिन अंत में ऐसा लगता है कि अगर मैं ऑब्जेक्ट और हैश को हटा रहा हूं, तो स्मृति उपयोग समान रहता है।पर्ल

my $hash = {}; 
............. 
this ds gets populated with a lot of data ... 
....... 
{ 
     my $obj = new Class("data"=>$hash); 
....... 
....... 
...... 

} 

#even undefing the $hash 
undef $hash; 

# I can expect some improvement in Memory Utilization, but its not happening 

मुझे लगता है कि मैं कुछ बहुत ही बुनियादी गलतियों कर रहा हूँ:

यहाँ समस्या का एक नमूना है। क्या कोई सुझाव दे सकता है?

उत्तर

3

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

मान लीजिए कि आपके पास कुछ विशेष मामला था, जैसे कि पृष्ठभूमि में लगातार चलती एक स्क्रिप्ट, लेकिन कभी-कभी स्मृति-गहन कार्य करने की आवश्यकता होती है। आप इसे दो स्क्रिप्ट में विभाजित करके हल कर सकते हैं: background.pl और memory-intensive-task.pl। पृष्ठभूमि.पी आवश्यक होने पर स्मृति-intensive-task.pl निष्पादित करेगा। इस कार्यक्रम को पूरा होने और बाहर निकलने पर स्मृति मुक्त हो जाएगी।

12

आप वास्तव में ओएस पर वापस स्मृति वापस नहीं कर सकते हैं। पर्ल आमतौर पर इसे बाद में पुन: आवंटित करने के लिए रखेगा, हालांकि यह कभी-कभी कचरा इकट्ठा करेगा।

http://learn.perl.org/faq/perlfaq3.html#How-can-I-free-an-array-or-hash-so-my-program-shrinks-

और

http://clokwork.net/2012/02/12/memory-management-in-perl/

+0

वस्तुओं के मामले में क्या होता है? जब कोई वस्तु दायरे से बाहर हो जाती है, तो विनाशक को बुलाया जाता है। क्या यह अभी भी ऑब्जेक्ट में परिभाषित शब्दावली चर की स्मृति रखेगा? – Kallol

+0

@ कॉलोल, यह मामला दायरे से बाहर जाने वाले सामान्य चर से अलग नहीं है, सिवाय इसके कि आप अपने ऑब्जेक्ट का कुछ कस्टम क्लीनअप कर सकते हैं। मेमोरी * कुछ और के लिए उपयोग करने के लिए पर्ल के लिए स्वतंत्र होगा, लेकिन पर्ल अभी भी इसे सिस्टम पर वापस नहीं देगा। – dan1111

+0

किस तरह का custome सफाई किया जा सकता है? – Kallol