2012-12-27 44 views
7

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

{ "_id" : ObjectId("50dadc38bbd7591082d920f0"), "item" : "Pons", "lines" : 37 } 

तो मैं (pymongo का उपयोग कर अजगर में लिखा)

MapReduce करने के लिए इन दोनों कार्यों के लिए बनाया गया: मैं गिनती करने की कोशिश करने के लिए कितना समय हर आइटम संग्रह में एक दस्तावेज़ के

उदाहरण है चाहता था

all_map = Code("function() {" 
      " emit(this.item, 1);" 
      "}") 

all_reduce = Code("function (key, values) {" 
        " var sum = 0;" 
        " values.forEach(function(value){" 
        "  sum += value;" 
        " });" 
        " return sum;" 
        "}") 

यह एक आकर्षण की तरह काम करता था, इसलिए मैंने संग्रह भरना शुरू कर दिया। लगभग 30,000 दस्तावेजों पर, मैप्रिडस पहले से ही एक सेकंड से अधिक समय तक रहता है ... क्योंकि नोएसक्यूएल गति के बारे में उत्साहित है, मैंने सोचा कि मैं कुछ कर रहा होगा गलत!

स्टैक ओवरफ़्लो पर एक प्रश्न ने मुझे मोंगोडब की एकत्रीकरण सुविधा की जांच की। तो मैंने समूह + sum + sort thingies का उपयोग करने की कोशिश की। इस के साथ आया था:

db.wikipedia.aggregate(
{ $group: { _id: "$item", count: { $sum: 1 } } }, 
{ $sort: {count: 1} } 
) 

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

+1

$ समूह एक इंडेक्स का उपयोग नहीं कर सकता है और फिर आप एक पूर्णांक स्कैन और एक गणना वाले क्षेत्र पर सॉर्टिंग कर रहे हैं जो फिर से एक इंडेक्स का उपयोग नहीं कर सकता ... हम्म हाँ मुझे लगता है कि यह आसानी से धीमा और एमआर हो सकता है, एक नज़र डालें $ सॉर्ट पर नोटिस: http://docs.mongodb.org/manual/reference/aggregation/#_S_sort।अगर मैं ईमानदार हूं तो मुझे नहीं लगता कि यह टूल की गलती है लेकिन स्कीमा के अधिक डिज़ाइन के लिए यदि आपको रीयलटाइम-आईएसएच में इस तरह की कोई क्वेरी करने की आवश्यकता है तो – Sammaye

+0

स्पष्टीकरण के लिए इसे पढ़ें: http: // stackoverflow.com/questions/12015064/mongodb-mapreduce-and-sorting –

+0

@Sammaye जैसा कि आप मेरे समापन वाक्यों को पढ़ते हैं, आप देखेंगे कि मैं औजारों पर उत्साहित नहीं हूं। मुझे अभी तक नोएसक्यूएल और मोंगोडीबी के साथ कोई अनुभव नहीं है। मैं बस पूछ रहा हूं कि क्या गलत है। इस बात को ** सही ** तरीके से चलाने के लिए मैं अपने डिज़ाइन को कैसे सुधार सकता हूं। – Arninja

उत्तर

9

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

दुर्भाग्य से आप किसी भी डेटाबेस के लिए सबसे खराब ऑपरेटरों में से दो का उपयोग कर रहे हैं: पूर्ण तालिका स्कैन पर गणना वाले फ़ील्ड और समूह (या विशिष्ट)। इस मामले में समेकन ढांचे को क्षेत्र, समूह और फिर इन-मेमोरी (http://docs.mongodb.org/manual/reference/aggregation/#_S_sort) की गणना करना चाहिए गणना की गई फ़ील्ड को सॉर्ट करना चाहिए। यह मोंगोडीबी के प्रदर्शन के लिए एक बेहद अक्षम कार्य है, वास्तव में किसी भी डेटाबेस की संभावना है।

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

आप इसे पूर्व-समेकन द्वारा कर सकते हैं। तो आप grouped_wikipedia का एक और संग्रह बना सकते हैं और अपने आवेदन में आप इसे पर $set और $inc (घटनाओं की गणना करने के लिए) के साथ item पर केवल एक पंक्ति प्राप्त करने के लिए प्रबंधित करते हैं। यह शायद इस समस्या को हल करने की सबसे गंभीर विधि है।

हालांकि यह विस्तार संग्रह wikipedia के साथ इस अतिरिक्त संग्रह को प्रबंधित करने की एक और समस्या है, लेकिन मुझे विश्वास है कि यह सही प्रदर्शन करने का एक अपरिहार्य दुष्प्रभाव है। लाभ अतिरिक्त संग्रह को प्रबंधित करने के नुकसान से अधिक होंगे।

+0

लेकिन यदि आपके पास 8 मिलियन प्रविष्टियों के साथ संग्रह है, तो आप लगातार अपना नक्शा चला रहे हैं और अपने "कैश" को अद्यतित रखने के लिए इसे कम कर रहे हैं, क्या यह आपके डीबी को धीमा नहीं करता है? –

+0

@RobertReiz यह संभवतः, यह कुछ कारकों पर निर्भर करता है। मेरा मतलब है कि आपके पास जेएस इंजन का भार है, लेकिन जेएस एनग्ने अब एकल थ्रेडेड नहीं है और यह डीबी पर ताले को रिहा कर सकता है, जबकि यह प्रोसेसिंग करता है, इसलिए समस्या आईआरओ को एमबी के बाद लिखने के लिए आवश्यक है हालांकि, यदि आप एक एमआर चलाते हैं जो केवल कहता है, तो 5 मिनट प्रति 10,000 पंक्तियां आपको मिल जाएंगी कि मोंगोडीबी खुशी से उस – Sammaye

+0

से सामना कर सकती है, मुझे क्लाइंट के बारे में बहुत कुछ परवाह नहीं है, लेकिन मोंगोड प्रक्रिया है। मान लें कि मेरे पास 8 मिलियन प्रविष्टियां हैं और प्रत्येक प्रविष्टि के लिए मोंगोडीबी एमआर में 5 मिनट लगते हैं, तो मुझे अपने सभी कैशों की गणना करने के लिए 27 दिन की आवश्यकता है। यह वास्तविक समय से बहुत दूर है :-) –