2012-11-02 33 views
7

मेरे पास एक एकल डेटाबेस (300 एमबी & 42,924 दस्तावेज) है जिसमें लगभग 200 उपयोगकर्ताओं के लगभग 20 विभिन्न प्रकार के दस्तावेज़ शामिल हैं। दस्तावेज़ कुछ बाइट्स से आकार में कई किलोबाइट्स (150 केबी या तो) तक हैं।कॉच डीबी - फ़िल्टर प्रतिकृति - क्या गति में सुधार किया जा सकता है?

जब सर्वर अनलोड हो जाता है, तो निम्न प्रतिकृति फ़िल्टर फ़ंक्शन को पूरा होने में लगभग 2.5 मिनट लगते हैं। जब सर्वर लोड होता है, तो इसमें 10 मिनट लगते हैं।

क्या कोई इस बात पर टिप्पणी कर सकता है कि इन बार अपेक्षा की जाती है, और यदि नहीं, तो सुझाव दें कि को बेहतर प्रदर्शन प्राप्त करने के लिए मैं चीजों को कैसे अनुकूलित कर सकता हूं?

function(doc, req) { 
    acceptedDate = true; 
    if(doc.date) { 
     var docDate = new Date(); 
     var dateKey = doc.date; 
     docDate.setFullYear(dateKey[0], dateKey[1], dateKey[2]); 

     var reqYear = req.query.year; 
     var reqMonth = req.query.month; 
     var reqDay = req.query.day; 
     var reqDate = new Date(); 
     reqDate.setFullYear(reqYear, reqMonth, reqDay); 

     acceptedDate = docDate.getTime() >= reqDate.getTime(); 
    } 

    return doc.user_id && doc.user_id == req.query.userid && doc._id.indexOf("_design") != 0 && acceptedDate; 
} 

उत्तर

9

छानने का अनुकरण धीमी गति से काम करता है, क्योंकि प्रत्येक प्राप्त किए गए दस्तावेज़ के लिए जटिल तर्क चलाता है तय करने के लिए कि क्या यह दोहराने या नहीं:

  1. CouchDB अगले दस्तावेज़ को हासिल करेगा;
  2. क्योंकि फ़िल्टर फ़ंक्शन को लागू करना है, दस्तावेज़ JSON में परिवर्तित हो जाता है;
  3. JSONifyed दस्तावेज़ क्वेरी सर्वर पर stdio के माध्यम से गुजरता है;
  4. क्वेरी सर्वर दस्तावेज़ को संभालता है और JSON से इसे डीकोड करता है;
  5. अब, क्वेरी सर्वर लुकअप और आपके फ़िल्टर फ़ंक्शन को चलाता है जो true या false को CouchDB पर मान देता है;
  6. यदि परिणाम true दस्तावेज़ दोहराया जाना है;
  7. सभी दस्तावेजों के लिए पी .1 और लूप पर जाएं;

गैर-फ़िल्टर की गई प्रतिकृतियों के लिए इस सूची को ले लें, पी.2-5 को फेंक दें और पी 6 हमेशा true परिणाम दें। यह ओवरहेड पूरी प्रतिकृति प्रक्रिया धीमा कर देता है।

फ़िल्टर की गई प्रतिकृति गति में काफी सुधार करने के लिए, आप Erlang native server के माध्यम से एरलांग फ़िल्टर का उपयोग कर सकते हैं। वे कॉच डीबी के अंदर दौड़ते हैं, किसी भी स्टडीओ इंटरफ़ेस से गुज़रते नहीं हैं और कोई JSON डीकोड/एन्कोड ओवरहेड लागू नहीं होता है।

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

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