2012-02-22 6 views
12

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

प्रश्न: मैं वास्तविक डिवाइस के लिए इसे सही तरीके से कैसे आकार दूं? यह सब बहुत अच्छा लगता है कि एक एलआरयू कैश असली समाधान है और सॉफ़्ट रेफरेंस नहीं है, लेकिन यदि आप ओओएम अपवादों से बचने के लिए वास्तव में उत्सुक हैं, तो यह मुश्किल संदर्भों के किसी भी मेगाबाइट के साथ जाने के लिए बेहद असुरक्षित महसूस करता है। अगर आप मुझसे पूछें तो यह सिर्फ असुरक्षित है। वैसे भी, यह एकमात्र विकल्प प्रतीत होता है। मैं वास्तविक डिवाइस पर ऐप के ढेर आकार को खोजने के लिए getMemoryClass में देख रहा था (+ कैश को आकार देने से पहले मुक्त ढेर आकार की जांच करना)। आधार रेखा 16 मेग्स है जो ठीक लगता है, लेकिन मैंने ओओएम अपवादों को लगभग 5 मेगाबाइट्स ढेर आकार (ग्रहण MAT के अनुसार) फेंकने वाले उपकरणों (जी 1 पुराने उदाहरणों में उदाहरण के लिए) देखा है। मुझे पता है कि जी 1 बहुत पुराना है, लेकिन मुद्दा यह है कि मेरे अनुभव वास्तव में दस्तावेज के 16 मेग्स बेसलाइन के साथ संरेखित नहीं होते हैं। इसलिए मैं पूरी तरह से अनिश्चित हूं कि मुझे एलआरयू कैश को कैसे बढ़ाया जाना चाहिए यदि मुझे सबसे ज्यादा आवश्यकता हो तो मैं उचित रूप से प्राप्त कर सकता हूं। (8 मेग्स से खुश होगा और कम-स्पीक डिवाइस पर 1 मेग के रूप में छोटा होगा)

किसी भी संकेत के लिए धन्यवाद।

संपादित करें: एंड्रॉयड LRU कैश वर्ग मैं की बात कर रहा हूँ: अपने प्रश्न से http://developer.android.com/reference/android/util/LruCache.html

उत्तर

14

मुझे लगता है कि LruCache आकार की गणना करने के लिए एक मान्य समाधान देव गाइड में उल्लिखित है:

int memClass = ((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass(); 
int cacheSize = 1024 * 1024 * memClass/8; 

अधिक जानकारी यहां पाया जा सकता है: http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

+0

हाँ, मैं मेमोरी क्लास का एक समान तरीके से उपयोग कर समाप्त हुआ। मुझे अभी भी अनुमान लगाया गया है, लेकिन मैं एक और सटीक विधि में नहीं आया था। – user289463

+3

सुनिश्चित करें कि आकार ओफ बाइट्स में आकार भी देता है। उपरोक्त लिंक में उन्होंने bitmap.getByteCount()/1024 (किलो बाइट्स में! यह निश्चित रूप से काम करता है लेकिन फिर आपका कैश आकार 1024 * memClass/8 होना चाहिए) – DominicM

0

इसकी एक सा समझने के लिए आप क्या कह रहे हैं भ्रामक। मुझे इसे एक शॉट देने दो।

विभिन्न कैशिंग उत्पादों AppFabric, memcached, ncache और scaleout प्रति ऑब्जेक्ट पर 1 एम सीमा है। मुझे लगता है कि स्केलआउट कुछ प्रकार के अनुकूलन की पेशकश करता है।

लेकिन ये सभी सर्वर साइड उत्पाद हैं। तो एक एंड्रॉइड डिवाइस के लिए, जो शायद एक मेजबान स्थानीय कैश होगा, शायद मैं अधिकतम 64 केबी के साथ जाऊंगा। मेरा मतलब है, किसी डिवाइस पर प्रति व्यक्ति 64kb से अधिक की आवश्यकता क्यों होगी। बस मेरा अनुमान है।

यदि मैं आप थे, तो मैं memcached (सबसे प्रसिद्ध ओपन सोर्स कैशिंग समाधान) का अध्ययन करूंगा। और स्केलआउट हो सकता है क्योंकि एक हैलो वर्ल्ड भी स्केल आउट के साथ काम करना आसान है। और आनुपातिक रूप से फैसला करें।

+0

हाय सिद्धार्थ, एंड्रॉयड का एक बहुत ही विशिष्ट उद्देश्य पर कैशिंग (मेमोरी और स्टोरेज) कैशिंग सूचियों और थंबनेल है। एक थंबनेल आसानी से 20 किलोबाइट हो सकता है और आप ग्रिड में 40-50 थंबनेल प्रदर्शित करेंगे। मैं मेगाबाइट्स के बारे में बात कर रहा हूं। सवाल एंड्रॉइड विशिष्ट परिप्रेक्ष्य से उचित आकार खोजने के बारे में अधिक है। यह सर्वर साइड समाधान से संबंधित नहीं है, क्योंकि आप अपने सर्वर के हार्डवेयर को जानते हैं, लेकिन आप सभी 700 सौ अलग-अलग एचडब्ल्यू कॉन्फ़िगरेशन नहीं जानते हैं जिन पर आपका एंड्रॉइड ऐप चलाएगा। – user289463

+0

तो अगर मुझे गलत नहीं है, तो एंड्रॉइड में द्वितीयक भंडारण नहीं है जो स्मृति की तुलना में धीमा है? वे सभी एक ही स्मृति, प्राथमिक और माध्यमिक हैं। तो कोई भी एलआरयू कैश क्यों चाहेंगे? मैं सोचता हूं ? – Siddharth

+0

रैम है जिसे मैं एलआरयू कैश के साथ उपयोग करने जा रहा हूं। यह सबसे तेज़ है। फिर आंतरिक भंडारण है जो अगले सबसे तेज़ है। बाहरी भंडारण भी है जो कुछ भी हो सकता है, यहां तक ​​कि एक धीमी एसडी कार्ड भी हो सकता है। मैं यहाँ अपने एल 1 कैश के रूप में रैम के बारे में बात कर रहा हूँ। – user289463

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