सबसे कुशल कैश रिप्लेसमेंट एल्गोरिथ्म [बंद]


12

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

अगर मुझे अपने ओएस कोर्स से सही तरीके से याद है, तो LRU सबसे अच्छा सामान्य कैश रिप्लेसमेंट एल्गोरिथम है। लेकिन शायद मुझसे गलती हुई है।

इसके अलावा, यह एक अकादमिक सवाल है, क्योंकि आम तौर पर, मुख्य मेमोरी सस्ती और प्रचुर मात्रा में होती है और मुझे वास्तव में कैश आकार के बारे में बहुत चिंता करने की आवश्यकता नहीं है।


1
क्या आपके आवेदन के लिए पूर्व-प्राप्त करना प्रासंगिक है? यदि ऐसा है, तो एल्गोरिदम का चयन करते समय पूर्व-प्राप्त करने और बनाए रखने की रणनीति को एक साथ माना जाना चाहिए।
rwong

आपको नमूना निशान (डेटा एक्सेस पैटर्न की सूची) प्राप्त करने की आवश्यकता होगी जो आपके इच्छित एप्लिकेशन डोमेन के प्रतिनिधि हैं। आप अकादमिक शोध से सार्वजनिक रूप से उपलब्ध परीक्षण सेटों को खोजने में सक्षम हो सकते हैं। फिर आप प्रत्येक एल्गोरिथ्म को लागू कर सकते हैं, सिमुलेशन कर सकते हैं और अपने निष्कर्षों की रिपोर्ट कर सकते हैं। असफल होना, विरल यादृच्छिक प्रतिस्थापन के साथ LRU का उपयोग करें।
rwong

1
आप "आवेदन के बारे में लगभग कुछ भी नहीं पता है" तो यह है अब तक के बारे में "कुशल" कैश प्रतिस्थापन एल्गोरिदम के लिए जल्दी करने के लिए।
अपराह्न

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

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

जवाबों:


15

मुझे लगता है कि सबसे अच्छा जवाब यह है कि यह निर्भर करता है। मेरे अनुभव में बहुत सारे कारक हैं जो कैशिंग एल्गोरिदम को चुनने में जाते हैं।

विचार करने के कारक

  1. बैलेंस पढ़ें / लिखें। (कितने प्रतिशत तक पहुँच लिखता है बनाम लिखता है)
  2. कैश की मात्रा।
  3. कैश के पीछे मीडिया का प्रकार। (वे धीमी गति से SATA ड्राइव या तेज SSD ड्राइव हैं?)
  4. हिट्स बनाम मिसेज। (चीजें कितनी बार फिर से लिखी या फिर से लिखी जाती हैं?
  5. औसत पहुंच आकार (यह पृष्ठ आकार चुनने में जाता है)
  6. कितनी महंगी पढ़ी-लिखी हैं।

एक बार जब आप सभी अलग-अलग कारकों पर विचार करते हैं, तो आपको एक कैश एल्गोरिथ्म खोजने की आवश्यकता होती है जो सबसे अच्छा संभालती है। उदाहरण के लिए कहें कि आपके पास एक एप्लिकेशन है जहां बहुत सारे लेखन हैं, कुछ फिर से लिखते हैं, हाल ही में लिखे गए डेटा और कुछ प्रकार के कताई मीडिया को पढ़ते हैं। इस मामले में आप हाइब्रिड कैशिंग एल्गोरिथ्म का एक प्रकार चाहते हैं। लिखने के डेटा को संभालने के लिए आप वाइज ऑर्डर ऑफ राइट्स (WOW) और डिस्क से पढ़े गए डेटा के लिए LRU एल्गोरिथम जैसा कुछ चाहते हैं। इसका कारण यह है कि डिस्क एक्सेस बहुत महंगे हैं और WOW एल्गोरिदम डेटा को लिखने के लिए इसे और अधिक कुशल बना देगा और LRU अक्सर एक्सेस किए गए डेटा को हमेशा कैश में रखेगा।

मान लें कि आपके पास SSD डिस्क हैं, जिनके पास बहुत तेज़ पहुंच का समय है, आप अपनी पसंद को LRU एल्गोरिथम की ओर गियर करना चाह सकते हैं क्योंकि डिस्क एक्सेस अपेक्षाकृत सस्ती है।

तो वास्तव में मैं जो कहना चाहता हूं वह यह है कि कोई "सर्वश्रेष्ठ" उत्तर नहीं है। सबसे अच्छा जवाब उन कारकों को पता है जो आपके लिए लागू होते हैं और एक एल्गोरिथ्म चुनते हैं जो उन्हें सबसे अच्छा संभालता है।

आपके लिए एल्गोरिथ्म कैसे खोजना है

अपने सिस्टम को प्रोफाइल करें। इसमें आमतौर पर मेमोरी एक्सेस के लिए आंकड़े रखने के लिए कोड जोड़ना शामिल होता है। प्रोफाइलिंग करके आप देख सकते हैं कि कौन से कारक आपके लिए सबसे महत्वपूर्ण हैं।

पिछले समय में मैंने सभी मेमोरी एक्सेस को ट्रैक करने के लिए कोड जोड़ा है। फिर बाद में मैं पैटर्न की तलाश करता हूं। मैं फिर से पढ़ता हूं, फिर से लिखता हूं, अनुक्रमिक पहुंच, यादृच्छिक अभिगम आदि की तलाश करता हूं।

एक बार जब आप महत्व की चीजों की पहचान कर लेते हैं, तो आपको सभी अलग-अलग प्रकार के कैशिंग एल्गोरिदम को देखने की जरूरत है, जो यह देखते हैं कि कौन सी चीजें सबसे अच्छी हैं।


कारकों का महान टूटना। लेकिन मुझे यकीन नहीं है कि उन लोगों को कैसे लागू किया जाए, यह देखते हुए कि मैं ऐप डोमेन और कारकों को जानता हूं।
1

@ डैश: पुरानी इंजीनियरिंग तकनीक है: विभिन्न तरीकों से कुछ बनाएँ और मापें जो सबसे अच्छा काम करता है।
डोनल फैलो

जब मैं "कैश" सुनता हूं तो मुझे लगता है कि मेमोरी और सीपीयू रजिस्टरों के बीच भंडारण है। यहां आप डिस्क कैश के बारे में बात कर रहे हैं, जो एक लेयर इनबेटविले मेमोरी है और एक या एक से अधिक i / o डिवाइस है।
ओमेगा सेंटौरी

@ barrem23 यदि आप वितरित प्रोग्रामिंग कर रहे हैं, तो विचार करने के लिए "कैश और बैक-एंड स्टोरेज कैश के बीच की दूरी" भी है। इससे कोई फ़र्क नहीं पड़ता है, अगर आपके पास एसएसडी या कताई जंग है, तो भंडारण, यदि भंडारण 15 एमएस से दूर है, तो आप हमेशा न्यूनतम 30 एमएस राउंड-ट्रिप का उपयोग करेंगे।
वेटिन

9

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

उदाहरण के लिए, केवल दो कार्यान्वयन करें: कम से कम हाल ही में प्रयुक्त और कम से कम अक्सर प्रयुक्त। कैसे तय करें कि किस को दूसरे से पहले इस्तेमाल करना है?

  • LRU अच्छा है जब आपको पूरा यकीन है कि उपयोगकर्ता अधिक से अधिक हाल की वस्तुओं का उपयोग करेगा, और कभी-कभार या कभी-कभार पुराने वाले पर वापस नहीं लौटेगा। एक उदाहरण: एक ई-मेल क्लाइंट का सामान्य उपयोग। ज्यादातर मामलों में, उपयोगकर्ता लगातार सबसे हाल के मेल तक पहुंच रहे हैं। वे उन्हें पढ़ते हैं, उन्हें स्थगित करते हैं, कुछ मिनट, घंटों या दिनों में वापस लौटते हैं, आदि वे खुद को एक मेल खोज सकते हैं जो उन्हें दो साल पहले मिला था, लेकिन यह पिछले दो घंटों में प्राप्त मेलों तक पहुंचने से कम बार होता है।

  • दूसरी ओर, LRU उस संदर्भ में कोई मतलब नहीं रखता है जहां उपयोगकर्ता कुछ वस्तुओं को दूसरों की तुलना में बहुत अधिक बार एक्सेस करेगा। एक उदाहरण: मैं अक्सर अपने पसंद के संगीत को सुनता हूं, और ऐसा हो सकता है कि 400 गीतों पर, मैं प्रति सप्ताह कम से कम एक बार पांच सुनता हूं, जबकि मैं प्रति वर्ष सबसे अधिक बार सुनता हूं 100 गाने मुझे भी पसंद नहीं हैं बहुत। इस मामले में, एलएफयू बहुत अधिक उपयुक्त है।

केवल दो कार्यान्वयन करके, आप देखते हैं कि कोई "डिफ़ॉल्ट" एल्गोरिथ्म नहीं है जिसका उपयोग आप तब कर सकते हैं जब आप यह नहीं सोचना चाहते कि कौन से बेहतर है या आवेदन के बारे में पर्याप्त जानकारी नहीं है। यह, ठीक है, जैसे कि यदि डिफ़ॉल्ट रूप से पूछें, तो आपको पथरी के परिणाम को खोजने के लिए दो संख्याओं को जोड़ना, घटाना, गुणा करना या विभाजित करना होगा जब आपको इसके बारे में कुछ भी नहीं पता होगा।


ठीक है, तो मैं एक एल्गोरिथ्म चुनने के बारे में कैसे जाऊँ? विकिपीडिया की सूची के माध्यम से चलाएं और देखें कि सबसे उपयुक्त क्या है?
1

@ ashes999: बिल्कुल! सबसे पहले, आप करने के लिए एप्लिकेशन की आवश्यकताओं के बारे में अधिक जानते हैं, फिर आप विभिन्न कैश एल्गोरिदम के पेशेवरों और विपक्षों का विश्लेषण करते हैं, और अंत में आप अधिक उपयुक्त एक का चयन करते हैं।
बजे आर्सेनी मूरज़ेंको

3

केवल विकिपीडिया पर अपनी पसंद को सीमित क्यों करें? यदि आपके पास एसीएम डिजिटल लाइब्रेरी जैसे अनुसंधान डेटाबेस तक पहुंच है, तो आपको और भी अधिक एल्गोरिदम मिलेंगे। पेटेंट के साथ खिलवाड़ करने के बारे में भी जागरूक रहें। उदाहरण के लिए एआरसी एक अच्छा एल्गोरिथ्म है लेकिन दुर्भाग्य से यह पेटेंट है।


2

आप 'सर्वोत्तम' एल्गोरिथ्म पर बहुत समय व्यतीत कर सकते हैं, या आप सिस्टम के रीस्ट के साथ एक साधारण एल्गोरिथ्म और लागू कर सकते हैं। जब आपके पास कुछ परीक्षण योग्य होता है तो एल्गोरिथ्म के बारे में चिंता करें।

समय से पहले अनुकूलन ...


0

कोई पूर्ण कैश एल्गोरिथ्म नहीं है - आप हमेशा एक मामला पा सकते हैं जो बहुत बुरी तरह से व्यवहार करता है।

इसलिए यह जानना महत्वपूर्ण है कि जिस समस्या को कम से कम बुरा व्यवहार किया जाएगा, उसे निर्धारित करने के लिए कैश किया जा रहा है।

इसके अलावा, आपको इस बात पर विचार करना चाहिए कि आपको कब तक चीजों को कैश करने की जरूरत है और कब तक आप चीजों को कैश कर सकते हैं ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.