2012-05-15 15 views
10

मेरे पास एक बड़ा key-value जोड़ी डंप है, मुझे अपने django-Python webapp के लिए देखने की ज़रूरत है।Django-Python के लिए स्मृति में एक बड़ा शब्दकोश बनाए रखें?

तो, मैं निम्नलिखित विकल्प हैं:

  • स्टोर के रूप में json डंप और एक अजगर dict के रूप में यह लोड।
  • इसे dump.py पर संग्रहीत करें और उसमें से दस्तावेज़ आयात करें।
  • इस समस्या के लिए कुछ लक्षित सिस्टम का उपयोग करें: [क्या ये वास्तव में इस उपयोग के लिए हैं? ]
    • मेम-कैश
    • Redis
    • किसी भी अन्य विकल्प?

ऊपर से कौन सा जाने के लिए सही तरीका है?

आप memcache और redis की तुलना कैसे करेंगे?

अद्यतन:

  • मेरे शब्दकोश के बारे में 5 एमबी आकार में है और समय के साथ बढ़ती जाएगी।
  • रेडिस/मेमकैच का उपयोग हर समय एक सॉकेट मारने का एक ओवरहेड जोड़ता है, इसलिए dump.py बेहतर होगा क्योंकि इसे स्मृति में लोड करने में समय लगेगा लेकिन इसके बाद यह केवल मेमोरी लुकअप करेगा।

  • मेरे शब्दकोश हर दिन अद्यतन किया जाना, यह देखते हुए कि dump.py समस्या होगी, क्योंकि हम के रूप में मुझे लगता है कि यह redis में मक्खी पर प्रतिबिंबित करेगा फिर से लोड करने जहां Django सर्वर पुनः आरंभ करना चाहिए और memcache। केवल जब आप डेटा की बड़ी राशि है और आप बहुत बार देखने के लिए है

  • एक redis की तरह एक प्रणाली का उपयोग करता है, में यह मामला सॉकेट तो एक भूमि के ऊपर देता है, हम लाभ कैसे प्राप्त करते हैं?

कृपया इस पर अपने अनुभव साझा करें!

+3

निर्भर करता है आप अपनी खुद की सरल reloader बना सकते हैं। आपकी बाधा कहां है? –

+0

क्या आपको डेटाबेस की आवश्यकता है? – moooeeeep

+0

यदि आप सॉकेट के बारे में चिंतित हैं तो आप कितनी बार कुंजी की जांच करेंगे? –

उत्तर

6

मेमकैच या रेडिस चुनने के लिए, वे कम अंत हार्डवेयर (उदाहरण के लिए 80,000 req/s for REDIS on C2D Q8300) पर प्रति सेकंड हजारों अनुरोध करने में सक्षम हैं। 1ms से नीचे अच्छी तरह से विलंबता के साथ। आप कह रहे हैं कि आप 20 अनुरोध के क्रम में कुछ कर रहे हैं, इसलिए प्रदर्शन के अनुसार यह वास्तव में गैर-मुद्दा है।

यदि आप dump.py विकल्प चुनते हैं, तो आपको Django को पुनः लोड करने के लिए पुनरारंभ करने की आवश्यकता नहीं है।

dump.py:

[ dict code...] 

mtime = 0 

djago कोड:

import dump #this does nothing if it's already loaded 
stat = os.stat(dump_filename) 
if(stat.mtime > dump.mtime): 
    reload(dump) 
    dump.mtime = stat.mtime 

+0

रेडिस हिस्सा इसके लिए वास्तव में जानकारीपूर्ण +1 है। रीलोड() मुझे ज्ञात है, लेकिन मैंने इसे प्रत्येक 'mtime' के बाद पुनः लोड किया है, जिसमें लोड होने में 2 सेकंड लगते हैं और पृष्ठ अनुरोध को लटकते हैं। इसलिए, मैं हर बार 2 सेकंड के ओवरहेड नहीं ले सकता - एक बार जब मैं अपना निर्देश अपडेट करता हूं तो मैं सर्वर को फिर से शुरू कर दूंगा। वैसे भी पुनः लोड करना सवाल नहीं है। रेडिस हिस्सा है! –

+0

आपका मतलब "हर समय के लिए" क्या है? आपने कहा है कि शब्दकोश प्रतिदिन संशोधित किया जाता है, आपको इसे दिन में केवल एक बार फिर से लोड करना होगा। – vartec

+0

हां .. यहाँ mtime 1 दिन है। ठीक है, मैंने कहा कि यह डेढ़ साल में अपडेट हो सकता है। लेकिन, वास्तव में कोई फर्क नहीं पड़ता। रेडिस जानकारी महत्वपूर्ण थी –

2

मेमकैच, हालांकि एक महान उत्पाद, मेरी पुस्तक में रेडिस द्वारा ट्रिम किया गया है। यह कई चीजें प्रदान करता है जो memcached, दृढ़ता की तरह नहीं करता है।

यह हैशस जैसे अधिक जटिल डेटा संरचनाएं भी प्रदान करता है। आपका विशेष डेटा डंप क्या है? यह कितना बड़ा है, और कितना बड़ा/किस प्रकार के मूल्य?

+0

कृपया, प्रश्न में अद्यतन देखें। –

1

इसी तरह की समस्या के लिए मैंने एक dump.py के विचार का उपयोग किया है। मुझे लगता है कि अन्य सभी डेटा संरचनाओं को एक प्रकार की वस्तुओं को पाइथन वस्तुओं में बदलने के लिए एक परत की आवश्यकता होगी। हालांकि मुझे अभी भी लगता है कि यह डेटा आकार और आपके द्वारा संभाले जा रहे डेटा की मात्रा पर निर्भर करेगा।मेमकेचे और रेडिस में बेहतर अनुक्रमण होना चाहिए और वास्तव में बड़े डेटा सेट और रीगेक्स आधारित लुकअप जैसी चीजों की बात आती है। तो मेरी सिफारिश होगा

json - अगर आप कुछ अन्य सेवा अजगर फाइल करने के लिए http पर डेटा की सेवा कर रहे हैं - अगर डेटा संरचना बहुत बड़ी नहीं है और आप देखो अप के किसी भी विशेष प्रकार का

मेम्कैश की जरूरत नहीं है और redis - यदि डेटा वास्तव में बड़ा हो जाता है

+0

कृपया, प्रश्न में अद्यतन देखें। –

1

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

सॉकेट संचार स्वयं को ओवरहेड का अधिक परिचय नहीं देता है। आप शायद यूनिक्स डोमेन सॉकेट का उपयोग करके इसे थोड़ा सा वापस ले सकते हैं। किसी भी मामले में, यदि आप अपने डेटा को प्रक्रिया में नहीं रखते हैं, तो आपको किसी प्रकार की पाइप पर बात करनी होगी।

+0

सहमत .. तो क्या आपको लगता है कि यदि लुकअप 5 पेज लोड और प्रत्येक 100 पेज लोड हर मिनट की तरह हैं तो रेडिस का उपयोग किया जाना चाहिए? –

+0

@YugalJindle नहीं, मुझे लगता है कि आपको अपना डेटा प्रक्रिया में तब तक रखना चाहिए जब तक कि वास्तविक प्रोफाइलिंग से पता चलता है कि यह कोई समस्या पैदा कर रहा है। – Marcin