2013-02-12 14 views
9

मेरे पास एक ऐसा एप्लिकेशन है जो कई फाइलें खोलना चाहता है: समय-समय पर यह क्लाइंट अनुरोध कहता है, "एक्स फ़ाइल में कुछ डेटा जोड़ें" कह रहा है, और यह फ़ाइल आदर्श रूप से पहले से खोला जा सकता है, और फ़ाइल का हेडर सेक्शन पहले से ही है पार्स किया गया, ताकि यह लिखना तेज़ हो। हालांकि, यह कई फाइलें खोलना ऑपरेटिंग सिस्टम के लिए बहुत अच्छा नहीं है, और यदि हमारे डेटा-स्टोरेज की आवश्यकता होती है तो असंभव हो सकता है।फाइल हैंडल कैश कैसे करें?

तो मैं एक "मुझे, इस फाइल को संभाल देना उद्घाटन अगर यह कैश नहीं है" समारोह, और स्वचालित रूप से जिसके लिए, कहते हैं, पांच मिनट के लिए लिखा नहीं किया गया है फ़ाइलों को बंद करने के लिए कुछ प्रक्रिया चाहते हैं। कैशिंग फ़ाइल हैंडल के विशिष्ट मामले के लिए जो छोटे स्पर्ट्स में लिखे गए हैं, यह संभवतः है, लेकिन यह एक सामान्य पर्याप्त समस्या प्रतीत होती है कि ऐसा होना चाहिए जैसे "मुझे एक्स, नामक ऑब्जेक्ट दें यदि संभव हो तो कैश से "और" अब मैं ऑब्जेक्ट एक्स के साथ किया गया है, इसलिए इसे अब से पांच मिनट बेदखल करने के लिए योग्य बनाएं "।

core.cache लगता है कि यह इस उद्देश्य के लिए उपयुक्त हो सकता है, लेकिन documentation काफी कमी है और source इसे उपयोग करने के बारे में कोई विशेष सुराग प्रदान करता है। इसका टीटीएल कैश आशाजनक दिखता है, लेकिन साथ ही साथ अस्पष्ट है कि इसका उपयोग कैसे किया जाए, वस्तुओं को बेदखल करने के लिए कचरा संग्रह पर निर्भर करता है, इसलिए जब मैं इसे समाप्त करने के लिए तैयार हूं तो मैं संसाधन को साफ़ रूप से बंद नहीं कर सकता।

मैं अपना खुद का रोल कर सकता हूं, लेकिन कई मुश्किल स्पॉट हैं और मुझे यकीन है कि मुझे कुछ चीजें कम से कम गलत मिलेंगी, इसलिए मुझे उम्मीद है कि कोई मुझे वहां के कार्यान्वयन के लिए इंगित कर सकता है यह कार्यक्षमता। मेरा कोड क्लोजर में है, लेकिन निश्चित रूप से पर जावा लाइब्रेरी का उपयोग करना बिल्कुल ठीक होगा, जहां सबसे अच्छा कार्यान्वयन मिल सकता है।

उत्तर

5

Guava's cache implementation देखें।

  • आप के लिए get पद्धति के लिए एक Callable (या एक CacheLoader) की आपूर्ति कर सकते "अगर संभाल कैश किया गया है, इसे वापस अन्यथा खुले, कैश और इसे वापस" अर्थ विज्ञान
  • आप समय बेदखली ऐसे कॉन्फ़िगर कर सकते हैं expireAfterAccess
  • के रूप में आप एक RemovalListener रजिस्टर कर सकते हैं जुड़ा हुआ अमरूद से कोड उदाहरण को संशोधित हटाने

पर हैंडल बंद करने के लिए पेज थोड़ा, CacheLoader का उपयोग कर:

LoadingCache<Key, Handle> graphs = CacheBuilder.newBuilder() 
    .maximumSize(100) // sensible value for open handles? 
    .expireAfterAccess(5, TimeUnit.MINUTES) 
    .removalListener(removalListener) 
    .build(
     new CacheLoader<Key, Handle>() { 
     public Handle load(Key key) throws AnyException { 
      return openHandle(key); 
     } 
     }); 

RemovalListener<Key, Handle> removalListener = 
    new RemovalListener<Key, Handle>() { 
    public void onRemoval(RemovalNotification<Key, Handle> removal) { 
     Handle h = removal.getValue(); 
     h.close(); // tear down properly 
    } 
    }; 

* अस्वीकरण * मैं कैश अपने आप को इस तरह से उपयोग नहीं किया है, तो आप इस समझदारी का परीक्षण करता है।

+0

यह काफी उपयुक्त लगता है, धन्यवाद! एकमात्र चीज जिसके बारे में मुझे चिंता है, यह है कि कैश से कोई आइटम प्राप्त करना संभव है और समाप्ति समय से अधिक समय तक इसे लटका देना, सक्रिय रूप से इसका उपयोग करना। यदि समाप्ति कोड आइटम को नीचे आँसू देता है, तो यह खतरनाक हो जाता है। क्या आप कैश के "ऑब्जेक्ट को चेक आउट" करने के तरीके के बारे में जानते हैं, जैसे कि इसे वापस चेक किए जाने तक इसे तोड़ा नहीं जाएगा? – amalloy

+0

एचएम, मुझे लगता है कि यह निर्भर करता है। क्या ऐसा हो सकता है कि आप लगातार = = 5 मिनट के लिए फ़ाइल में लिखते हैं? क्या कैश एक समय में केवल एक अनुरोध से पहुंचा है? सुनिश्चित करें कि आप यहां प्रलेखन की जांच करें: निष्कासन स्वचालित रूप से समाप्ति पर नहीं होता है, लेकिन कैश से/लिखने/लिखने के दौरान। हो सकता है कि यह अच्छा है (यदि आपके पास एक अनुरोध है जो लंबे समय तक लिख सकता है, तो इसे तोड़ा नहीं जाएगा), शायद बुरा क्योंकि क्योंकि एक समय में एक से अधिक अनुरोध हैं या आप पहले/में हैंडल साफ़ करना चाहते हैं पृष्ठभूमि ... –

+0

यहां देखें: http://code.google.com/p/guava-libraries/wiki/CachesExplained#When_Does_Cleanup_Happen? –

0

ओएस कुछ सीमाएं हैं: Is there a limit on number of open files in Windows

SortedMap< Date, File > cache = new TreeMap<>(); 
cache.put(new Date(), file); 
Timer timer = new Timer(true); 
timer.scheduleAtFixedRate(task, 60*1000L, 60*1000L); 

कैश शुद्ध करने के लिए: पहले उसे हटा अगर यह उम्र> 5 मिनट है, जब तक पहले उम्र> 5 मिनट दोहराएँ।