2012-12-23 38 views
9

मैं कुछ पीएनजी छवियों को सेवा देने के लिए node.js का उपयोग कर रहा हूं जो एक SQLite डेटाबेस में बाइनरी BLOBs के रूप में संग्रहीत हैं। ये छवियां औसत 9500 बाइट्स पर छोटी हैं।क्या node.js SlowBuffers "धीमा" बनाता है?

मैं the sqlite3 npm package का उपयोग कर रहा हूं, जो बाइनरी बीएलओबी ऑब्जेक्ट्स को SlowBuffers के रूप में वापस करने के लिए प्रतीत होता है। मेरे Node.js सेवा इन SlowBuffers स्मृति में धारण आईओ विलंबता कम करने के लिए, उन्हें इस तरह की सेवा:

response.send(slowBuffer); 

ऐसा प्रतीत होता है SlowBuffer एक अंतरफलक Buffer के समान है; Buffer को बदलने तुच्छ है:

var f = function(slowBuffer) { 
    var buffer = new Buffer(slowBuffer.length); 
    slowBuffer.copy(buffer); 
    return buffer; 
} 

मैं इन SlowBuffersBuffers में कन्वर्ट करना चाहिए?

मुझे समझने में सहायता करें कि उन्हें "धीमी" बफर क्यों कहा जाता है।

उत्तर

14

आप पोस्ट पढ़ चाहते हैं:

  1. https://groups.google.com/forum/?fromgroups=#!topic/nodejs-dev/jd52ZsVSZNo
  2. https://groups.google.com/forum/?fromgroups=#!topic/nodejs/s1dnFbb-Rj8

नोड बफर वस्तुओं के दो प्रकार प्रदान करता है। Buffer मूल जावास्क्रिप्ट डेटा संरचना है; SlowBuffer एक सी ++ मॉड्यूल द्वारा लागू किया गया है। मूल जावास्क्रिप्ट पर्यावरण से सी ++ मॉड्यूल का उपयोग अतिरिक्त CPU समय की लागत है, इसलिए "धीमी"। Buffer ऑब्जेक्ट्स SlowBuffer ऑब्जेक्ट्स द्वारा समर्थित हैं, लेकिन सामग्री को बेहतर प्रदर्शन के लिए सीधे जावास्क्रिप्ट से पढ़ा/लिखा जा सकता है।

कोई भी Buffer 8 KB से बड़ा ऑब्जेक्ट एक SlowBuffer ऑब्जेक्ट द्वारा समर्थित है। एकाधिक Buffer 8 KB से छोटी वस्तुओं को एक SlowBuffer ऑब्जेक्ट द्वारा समर्थित किया जा सकता है। जब Buffer 8 KB से छोटी वस्तुएं स्मृति में मौजूद होती हैं (एक SlowBuffer द्वारा समर्थित), तो C++ मॉड्यूल जुर्माना बहुत अधिक हो सकता है यदि आप इसके बजाय SlowBuffer का उपयोग प्रत्येक के लिए करते हैं। छोटे Buffers अक्सर बड़ी मात्रा में उपयोग किया जाता है।

This class is primarily for internal use मतलब है कि अगर आप तो अपने दम पर सर्वर पर बफ़र्स प्रबंधन करने के लिए, चाहते हैं (आप SlowBuffer खुद के विभाजन के लिए है छोटे मात्रा में उपयोग करने के लिए) का उपयोग SlowBuffer। जब तक आप बफर को संभालने में उस मिनट स्तर के नियंत्रण को नहीं चाहते हैं, तो आपको Buffer ऑब्जेक्ट्स का उपयोग करने के साथ ठीक होना चाहिए।

+1

यदि 'बफर' में डेटा अभी भी 'स्लोबफर' का उपयोग कर रहा है, तो अंतर क्यों? क्या यह है कि पूर्व आवंटित 'स्लोबफर' है? – Brad

+0

दोनों मेमोरी आवंटन ठीक हैं लेकिन बफर मेमोरी में हेरफेर करने के लिए देशी जेएस फ़ंक्शंस का उपयोग करता है, जबकि स्लोबफर बाहरी सी ++ एपीआई का उपयोग करता है। जब आप code+ एपीआई को node.js. से कॉल करते हैं तो एक ओवरहेड होता है। – user568109

+1

क्या 'बफर' केवल 'स्लोबफर' का उपयोग करता है जब स्मृति की आवश्यकता 8K से अधिक होती है? यह संघर्ष में है, "प्रत्येक बफर वास्तव में स्लोबफर द्वारा समर्थित है", जहां मैं उलझन में हूं। – Brad