2011-04-01 8 views
6

मैं एक सी # अनुप्रयोग में एक लुकअप मानचित्र या शब्दकोश का उपयोग करना चाहता हूं, लेकिन यह 1-2 जीबी डेटा स्टोर करने की उम्मीद है।मैं सी # में एक बहुत बड़े शब्दकोश का उपयोग कैसे कर सकता हूं?

क्या कोई कृपया बता सकता है कि क्या मैं अभी भी शब्दकोश कक्षा का उपयोग करने में सक्षम हूं, या अगर मुझे किसी अन्य वर्ग का उपयोग करने की आवश्यकता है?

संपादित करें: हमारे पास एक मौजूदा एप्लिकेशन है जो क्वेरी या लुकअप ऑब्जेक्ट विवरण के लिए ऑरैक डेटाबेस का उपयोग करता है। हालांकि यह बहुत धीमी है, क्योंकि वही वस्तुओं को बार-बार पूछताछ की जा रही है। मुझे लगता है कि प्रतिक्रिया समय में सुधार करने के लिए, इस परिदृश्य के लिए लुकअप मानचित्र का उपयोग करना आदर्श हो सकता है। हालांकि मैं चिंतित करता है, तो आकार यह एक समस्या साबित होगा

+0

क्या आपने उस शब्दकोश का एक उदाहरण कताई करने का प्रयास किया है जो उस स्मृति का उपयोग करता है? साथ ही, क्या यह एप्लिकेशन 32 या 64 बिट सिस्टम पर तैनात किया जा सकता है? – RQDQ

+1

क्यों एक शब्दकोश या स्मृति डेटा संरचना? डेटाबेस क्यों नहीं? –

+2

एसक्ललाइट में एक अच्छी इन-मेमोरी डीबी है जो आपकी स्थिति के लिए दिलचस्प हो सकती है। – gt124

उत्तर

7

लघु उत्तर

हां। यदि आपकी मशीन में संरचना के लिए पर्याप्त स्मृति है (और शेष कार्यक्रम और ओवर ऑपरेटिंग सिस्टम सहित सिस्टम)।

लांग उत्तर

क्या आप वाकई चाहते हैं? अपने आवेदन के बारे में और जानने के बिना, यह जानना मुश्किल है कि क्या सुझाव देना है।

  • डेटा कहां से आ रहा है? एक पंक्ति? फ़ाइलें? एक डेटाबेस? सेवा?
  • क्या यह एक कैशिंग तंत्र है? यदि हां, तो क्या आप थोड़ी देर तक पहुंच नहीं पाएंगे, जब आप कैश से वस्तुओं को समाप्त कर सकते हैं? इस तरह, आपको हर समय स्मृति में सब कुछ पकड़ना नहीं है।
  • जैसा कि अन्य ने सुझाव दिया है, यदि आप बस बहुत सारे डेटा स्टोर करने की कोशिश कर रहे हैं, तो क्या आप बस डेटाबेस का उपयोग कर सकते हैं? इस तरह आपको स्मृति में सभी जानकारी एक बार में नहीं होना चाहिए। अनुक्रमण के साथ, अधिकतर डेटाबेस तेजी से पुनर्प्राप्त करने में उत्कृष्ट होते हैं। आप इस दृष्टिकोण को कैश के साथ जोड़ सकते हैं।
  • क्या डेटा केवल स्मृति में पढ़ा जाएगा, या कुछ बदलाव होने पर इसे कुछ स्टोरेज पर वापस रखा जाना चाहिए?
  • स्केलेबिलिटी - क्या आप उम्मीद करते हैं कि इस शब्दकोश में संग्रहीत डेटा की मात्रा में वृद्धि होगी जैसे समय चल रहा है?यदि ऐसा है, तो आप उस बिंदु पर दौड़ने जा रहे हैं जहां यह मशीन खरीदने के लिए बहुत महंगा है जो इस डेटा को संभाल सकता है। यदि यह मामला है (ऐपफ्रैब्रिक दिमाग में आता है) तो आप एक वितरित कैशिंग सिस्टम देखना चाहेंगे ताकि आप लंबवत (अधिक मशीनों) को लंबवत (एक असफलता का एक बड़ा महंगा बिंदु) के बजाय स्केल कर सकें।

अद्यतन

पोस्टर के संपादित के प्रकाश में, ऐसा लगता है जैसे कैशिंग यहाँ एक लंबा रास्ता तय होता लग रहा है। ऐसा करने के कई तरीके हैं:

  • सरल शब्दकोश कैशिंग - केवल अनुरोध किए गए कैश सामान।
  • Memcache
  • Caching Application Block मैं इस कार्यान्वयन का एक बड़ा प्रशंसक नहीं हूं, लेकिन दूसरों को सफलता मिली है।
0

आप कर सकते हैं लेकिन बड़े रूप में एक शब्दकोश के लिए के रूप में है कि तुम, जब तक आप एक 64GB मशीन पर हैं एक डेटाबेस

1

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

+1

बस एक साइड नोट ... 2 जीबी से अधिक मेमोरी लेने की प्रक्रिया के लिए एप्लिकेशन को 64 बिट (या 64 बिट मशीन पर कोई सीपीयू) में संकलित करने की आवश्यकता है (मुझे लगता है कि यह 2 जीबी है)। –

1

जब आप 1-2 जीबी डेटा कहते हैं, तो मुझे लगता है कि आप मानते हैं कि आइटम जटिल वस्तुएं हैं जिनमें संचयी रूप से 1-2 जीबी है।

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

हालांकि, जैसा कि सभी ने सुझाव दिया है, आपको शायद इसके बजाय डेटाबेस का उपयोग करना चाहिए।
आप SQL सीई जैसे मेमोरी डेटाबेस का उपयोग करना चाह सकते हैं।

0

डेटाबेस का उपयोग करें। सुनिश्चित करें कि आपके पास एक अच्छा डीबी मॉडल है, सही इंडेक्स डालें, और आप जाएं।

-2

आप subdictionaries का उपयोग कर सकते हैं।

Dictionary<KeyA, Dictionary<KeyB .... 

कहाँ KeyAKeyB के कुछ सामान्य हिस्सा है।

उदाहरण के लिए, यदि आपके पास String शब्दकोश है तो आप पहले अक्षर का उपयोग KeyA के रूप में कर सकते हैं।

+0

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

+0

यह एक समस्या हल करता है, हां यह विभाजन योजना है (शब्दकोशों के साथ समस्या - स्मृति आवंटन, जब स्मृति समाप्त होती है तो यह दो बार अधिक स्मृति आवंटित करती है, और विभाजन योजना का उपयोग करके प्रक्रिया इतनी दर्दनाक नहीं हो सकती है), और ऐसा लगता है कि यह एकमात्र तरीका है राम में वास्तव में बड़ा शब्दकोश होना चाहते हैं (डेटाबेस में नहीं), अगर आपके पास बहुत सी रैम है, या आप स्मृति से बाहर निकलेंगे। इसके अलावा आप अपने आवेदन को 64-बिट्स पर स्विच करने का प्रयास कर सकते हैं - शायद यह पहले होना चाहिए कि आपको क्या करना चाहिए ... –

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

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