2010-12-28 16 views
5

मैं एक नक्शा बनाने की कोशिश कर रहा हूं जिसमें प्रविष्टियां समय समाप्त हो जाएं और एक निश्चित समय अवधि के बाद हटा दी जाए।समय/क्षणिक प्रविष्टियों के साथ मानचित्र - स्मृति कोई समस्या नहीं

असल में, <K, V> Map.put(K key, V value, long **time**) - प्रविष्टि तुरंत नक्शे में रखी जाएगी और समय (एमएस) के बाद समाप्त हो जाएगी। मुझे भविष्य में किसी भी बिंदु पर निकाली गई प्रविष्टि को पुनर्प्राप्त करने की आवश्यकता नहीं है, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि यह अब मानचित्र में नहीं है।

उदाहरण के लिए: map.put("foo", "bar", 60l * 1000l) इस कुंजी-मूल्य जोड़ी को एक मिनट (60long और 1000long) के लिए मानचित्र में रहने देगा।

प्रयास: एक ConcurentMap का उपयोग करें और Map.put(K key, V value, long **time**) लागू निम्नलिखित के माध्यम से:
1. कॉल super.put(key, value)
2. एक धागा है कि समय (ms)
3. कॉल remove(key) प्रविष्टि को निकालने के लिए सोता पैदा करते हैं।

प्रश्न: कृपया टिप्पणी करें/मुझे बताएं कि क्या यह थ्रेड-सुरक्षा, स्थिरता या मेरे प्रयास में किसी भी दोष के संदर्भ में एक अच्छा विचार है। यदि आपको लगता है कि इसे पूरा करने का एक बेहतर तरीका है, तो कृपया कोई सलाह दें।

संपादित करें: उत्तर के लिए धन्यवाद, मेमोरी यहाँ कोई समस्या नहीं है, मैं वास्तव में केवल प्रविष्टियों के छोटे जीवन काल की परवाह करता हूं। धन्यवाद।

उत्तर

4

क्या समय आप जिस समस्या का समाधान कर रहे हैं उसका एक अनिवार्य हिस्सा है? या यह एक कार्यान्वयन विस्तार है? यदि आप जिस समस्या को हल कर रहे हैं वह स्मृति उपयोग में से एक है, दो अन्य संभावनाएं ध्यान में रखती हैं:

  • एक एलआरयू मानचित्र। वेब पर इनमें से कई हैं।
  • वीक रेफरेंस या सॉफ्ट रेफरेंस ऑब्जेक्ट्स द्वारा समर्थित एक मानचित्र, जो जीसी को उन वस्तुओं को इकट्ठा करने की अनुमति देता है।

संपादित

उस मामले में, वहाँ कुछ मौजूदा कार्यान्वयन है कि आप कुछ समय की बचत हो सकती है। उदाहरण के लिए:

  • TimedHashMap (एक कार्यान्वयन)
  • TimedHashMap (एक और कार्यान्वयन)
+0

उत्तर के लिए धन्यवाद, लेकिन मैं केवल समय के साथ यहां सवाल है, स्मृति कोई मुद्दा नहीं है। त्वरित संपादन के लिए –

+0

+1।मैं प्रविष्टियों को अलग-अलग समय के लिए जीवित रखना चाहता हूं लेकिन टाइमर के साथ दूसरा कार्यान्वयन बहुत उपयोगी है। धन्यवाद। –

1

आप (मानचित्र एक अस्थायी कैश है) कुछ स्मृति समस्या के कारण ऐसा कर रहे हैं, तो आप शायद चाहिए मुलायम संदर्भों का उपयोग करने पर विचार करें (documentation)।

+1

मैं यह नहीं ढूंढ पाया कि नरम संदर्भ मुझे वस्तुओं को समय देने की अनुमति देते हैं, क्या आप थोड़ा और विशिष्ट हो सकते हैं? धन्यवाद। –

+1

कोई वास्तविक कनेक्शन नहीं है। वह सिर्फ यह कह रहा है कि कैश और मुलायम संदर्भों के रूप में उपयोग किए जाने वाले मानचित्र के बीच अक्सर कनेक्शन होता है। अस्थायी बिट को अनदेखा किया जा सकता है। गुवा के मैपमेकर में नरम संदर्भ बनाने के विकल्प हैं, एफवाईआई। –

1

Guava पर एक नज़र डालें - यह Google की संग्रह लाइब्रेरी है। विशेष रूप से, आप कैशबिल्डर और इसके कंप्यूटिंग मानचित्र देखना चाहते हैं। इसकी विशेषताओं में से एक है "प्रविष्टियों का समय-समय पर समाप्ति, अंतिम पहुंच या आखिरी लेखन के बाद से मापा गया", जैसा कि आप खोज रहे हैं।

(CacheBuilder के बारे में बात करने के लिए संपादित; यह नई है के बाद से मैं इस पोस्ट की गई और सवाल से अधिक प्रासंगिक है)

+0

गुवा संदर्भ के लिए धन्यवाद। –

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