2012-05-02 25 views
9

ठीक है, इसलिए मैं नोड.जेएस पर आधारित एक एप्लीकेशन बना रहा हूं और मैं मोंगोड के साथ अपने कनेक्शन को संभालने के लिए मोंगोज का उपयोग कर रहा हूं।मेरा मोंगोडब कॉल इतना धीमा क्यों है?

getTestStream : function(req, res, conditions, callback) { 
    Activity.find() 
    .limit(1000) 
    .run(function(err, activities) { 
     if (err){ 
     util.sendError(req, res, "Query Error", err); 
     } else if (activities) {  
     res.send(activities); 
     } else { 
     util.send('nope'); 
     } 
    }); 
} 

किसी कारण से इस कॉल को पूरा करने के लिए 700 मि.से + लेता है: मैं एक endpoint कि इस तरह की है। मोंगोडब खोल से बने सीमा को लागू किए बिना एक ही कॉल लगभग 4ms में लौटाता है। ऐसा लगता है कि इतनी सरल सवाल है, तो इसे इतना धीमा कर रहा है? मुझे लगता है कि मैंने कहीं कॉन्फ़िगरेशन में कुछ स्पष्ट याद किया है, लेकिन मुझे कोई जानकारी नहीं है।

इस पर सहायता करने वाले किसी भी व्यक्ति को धन्यवाद।

अन्य जानकारी:

[email protected] 
[email protected] 
[email protected] 
+0

मैं नेवला साथ अत्यंत परिचित नहीं हूँ, इसलिए इस अंधेरे में सिर्फ एक गोली मार दी है तो आप अपने खोज आदेश से पहले अपनी सीमा निर्दिष्ट करने की आवश्यकता है? क्योंकि शायद यह बाहर जा रहा है और रिकॉर्ड्स को तुरंत() पर पुनर्प्राप्त कर रहा है, और फिर आप इसे किसी भी तरह फिर से सीमित करने की कोशिश कर रहे हैं? यह आपके प्रश्न के समान कुछ दिखता है: http://stackoverflow.com/questions/5539955/how-to-paginate-with-mongoose-in-node-js –

+0

इस प्रकार सीमा को शामिल करने के लिए क्वेरी को संशोधित करने से प्रदर्शन प्रभावित नहीं होता है कोई स्पष्ट तरीका। गतिविधि.फिंड ({}, {सीमा: 1000}) .रुन (फ़ंक्शन (त्रुटि, गतिविधियां) { –

+0

आपके दस्तावेज़ कितने बड़े हैं? क्या आप एक db.coll.stats() पोस्ट कर सकते हैं। –

उत्तर

9

थोड़ी देर के लिए प्रयोग करने के बाद, मैं सुस्ती के लिए कई योगदान मिल गया है, उम्मीद है कि यह एक ऐसी ही समस्या से किसी को भी मदद करता है:

  • वस्तुओं मैं का अनुरोध कर रहा हूँ बड़े हैं, इसलिए उन्हें कुछ समय लगता है प्रसंस्करण। बड़ी वस्तुओं के लिए क्वेरी को केवल उन फ़ील्ड को वापस करने के लिए संशोधित करें जिन्हें आपको की आवश्यकता है, अभी
  • मोंगोस उपयोगी है, लेकिन जब आप बहुत सारी वस्तुओं का अनुरोध करते हैं तो यह वास्तव में धीमा हो सकता है, यदि आप कॉल के लिए गति चाहते हैं तो नोड-मोंगोड-मूल के साथ सीधे इंटरफ़ेस करना बेहतर होता है। (यह मेरे परिदृश्य के लिए लगभग 50% + गति वृद्धि था)

इन तकनीकों का उपयोग करके मैं अब 1000 से पहले प्रसंस्करण की तुलना में कम समय में 4000 रिकॉर्ड संसाधित कर सकता हूं। Gates VP पर टिप्पणी करने वाले किसी भी व्यक्ति के लिए धन्यवाद, यह इंगित करने के लिए कि मोंगोज़ इस तरह के कॉल के लिए वास्तव में उपयुक्त नहीं था।

+1

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

+2

वे बड़े नहीं थे, यह थोड़ी देर के बाद से मैंने इस मुद्दे को संबोधित किया, शायद 4 स्ट्रिंग फ़ील्ड प्रत्येक के बारे में 50-100 वर्ण हैं। ध्यान रखें कि अब मोंगोज़ में एक [दुबला()] (http://mongoosejs.com/docs/api.html#query_Query-lean) विकल्प है जो किसी भी गेटर/सेटर रैपर ब्लोट को हटा देता है, साथ ही [स्ट्रीम() ] (http://mongoosejs.com/docs/2.7.x/docs/querystream.html) फ़ंक्शन ताकि आप परिणाम प्राप्त कर सकें। –

+0

दुबला के लिए टिप बंद करने के लिए धन्यवाद। मैं वर्तमान में ~ 280 रिकॉर्ड्स पुनर्प्राप्त कर रहा हूं लेकिन 200 से अधिक तत्वों वाले कुछ उप-दस्तावेज़ों के साथ, वे कई स्तरों को गहरा कर रहे हैं। यह मेरी मोंगोज़ क्वेरी 2.5 सेकंड से 15ms तक ले गया (जो मुझे मोंगो खोल में मिल रहा था)। – Leonidas

0

भी के बारे में 4ms में MongoDB खोल रिटर्न से बनाया गया एक सीमा लागू किए बिना ही कॉल।

खोल डिफ़ॉल्ट रूप से 30 या उससे अधिक की सीमा लागू करता है। शैल से वास्तविक सीमा के साथ करने का प्रयास करें?

इसके अलावा, आप शेल से .explain() आज़मा सकते हैं।

यदि इनमें से कोई भी काम नहीं करता है, तो आप @ केली बैंकर के सुझाव ले सकते हैं और the profiler देख सकते हैं।

+0

असभ्य प्रतीत नहीं होता है, लेकिन समस्या mongodb के साथ झूठ नहीं लगती है। जैसा कि मैंने ऊपर एक और टिप्पणी में कहा था: "यदि मैं mongo console/shell के अंदर db.activities.find()। सीमा (1000) .explain() चलाता हूं तो क्वेरी 5 मिलीसेकंड से कम लेती है।" प्रोफाइलर एंडपॉइंट से असली कॉल पर एक ही परिणाम दिखाता है। मैं इसे एक ड्राइवर कॉन्फ़िगरेशन या मोंगोस रैपर के साथ कुछ करने के लिए मान रहा हूं क्योंकि अब तक मुझे मोंगोडब भाग के साथ कोई दोष नहीं मिल रहा है। –

+1

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

+0

आह अच्छा कॉल। मैंने सोचा कि मैंने मोंगोज़ जोड़ा था लेकिन स्पष्ट रूप से नहीं। मैंने इस संग्रह को दूसरे संग्रह में अलग-अलग (छोटे) डेटाबेस ऑब्जेक्ट्स के साथ परीक्षण किया और यह लगभग 100 मिमी तेज दिखाई देता है, इसलिए यह सीधे डीबी रिकॉर्ड कितना जटिल हो सकता है कि पुनर्प्राप्ति पर प्रत्येक रिकॉर्ड को लपेटने के लिए कितना समय लगता है। –

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