2011-09-07 10 views
9

अन्य भाषाओं (जैसे जावा) में, वस्तु संदर्भ, मजबूत कमजोर, मुलायम या प्रेत (http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html) हो सकता है।पाइथन में "सॉफ्ट संदर्भ" मौजूद हो सकते हैं?

पायथन में, संदर्भ डिफ़ॉल्ट रूप से मजबूत होते हैं और वीकआरफ मॉड्यूल कमजोर संदर्भों की अनुमति देता है।

यह "सॉफ्ट संदर्भ" पायथन में करना संभव है?

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

उत्तर

6

पायथन मूल रूप से कठोर (उर्फ मजबूत) & कमजोर के अलावा संदर्भों के किसी भी स्वाद की पेशकश नहीं करता है।

उस ने कहा, here एक सॉफ्टफ्रफ़ कार्यान्वयन है जिसे मैंने एक साल या उससे पहले उठाया था, जिसे मैं कुछ स्थानों पर उपयोग कर रहा हूं, मुझे एक की आवश्यकता है। यह क्या प्रदान करता है काफी वास्तविक नरम संदर्भ नहीं है, लेकिन यह अधिकांश उपयोग मामलों के लिए करीब आता है। यह किनारों के चारों ओर थोड़ा मोटा है, लेकिन यह पूरी तरह कार्यात्मक है ... हालांकि यह आंतरिक संदर्भ में कुछ संदर्भों पर निर्भर करता है जिसका मतलब है कि यह शायद सीपीथॉन को छोड़कर कुछ भी तोड़ देगा।

विशेष रूप से, मैंने इसे महंगा-से-लंबे समय तक रहने वाली वस्तुओं के कैश के लिए लिखा है ... SoftValueDictionary बिल्कुल वही होना चाहिए जो आप खोज रहे हैं।

+0

यह फ़ाइल कॉपीराइट है, AFAICS के साथ, वितरण/पुन: उपयोग का कोई अधिकार नहीं है ... –

+3

@JamesBlackburn इसके लिए मेरी माफ़ी, मैंने उस स्क्रिप्ट को बिना किसी विचार के मेरे देव फ़ोल्डर से बाहर खींच लिया। मैंने बीएसडी लाइसेंस शामिल करने के लिए फ़ाइल को अपडेट किया है। –

+0

यह [मेरे प्रश्न] (http://stackoverflow.com/questions/14099804/object-pool-under-memory-constraints) का भी एक बड़ा जवाब है। सी के मॉलोक के एक अलग कार्यान्वयन के साथ अजगर को पुन: संकलित किए बिना, मुझे नहीं लगता कि कुछ भी बेहतर है। – max

0

एक और विकल्प कैश का उपयोग करना है जो स्पष्ट रूप से उनकी स्मृति खपत की गणना करने के बजाय वस्तुओं की एक निश्चित संख्या (उदा। 100) बनाए रखता है। जब किसी ऑब्जेक्ट को एक्सेस किया जाता है, तो यह कैश के शीर्ष पर रखा जाता है यदि यह मौजूद है, या कैश के निचले भाग पर ऑब्जेक्ट को नए ऑब्जेक्ट से बदल दिया गया है।

untested है, लेकिन यह सिद्धांत रूप में काम करना चाहिए।

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