यहाँ दो प्रश्न हैं।
कार्यक्रम को इतनी मेमोरी की आवश्यकता क्यों है?
मुझे लगता है कि यह पीठ के दबाव की कमी के कारण है।
आपकी स्क्रिप्ट रेडिस को सिर्फ 1M पब्लिश कमांड भेजती है, लेकिन यह इन कमांड्स के किसी भी जवाब को प्रोसेस नहीं करती है (जो कि सिर्फ नोड_रेडिस द्वारा छोड़े गए हैं)। क्योंकि यह कभी किसी उत्तर की प्रतीक्षा नहीं करता है, स्क्रिप्ट इन सभी आदेशों के लिए स्मृति में बहुत सारे संदर्भ जमा कर देगी। node_redis को कमांड का ट्रैक रखने और Redis कमांड और उत्तरों को संबद्ध करने के लिए एक संदर्भ रखने की आवश्यकता है। Node.js कमांड को एनक्यू करने के लिए तेज़ है, सिस्टम की तुलना में उन कमांड को रेडिस तक पहुँचाना है, उन्हें प्रोसेस करना है, उत्तर बनाना है, और जवाबों को वापस नोड.जेएस तक पहुँचाना है। इसलिए संदर्भ बढ़ रहा है, और यह बहुत सारी स्मृति का प्रतिनिधित्व करता है।
यदि आप मेमोरी की खपत को स्वीकार्य स्तर पर रखना चाहते हैं, तो आपको नोड.जेएस को रेडिस उत्तरों को संसाधित करने का मौका देने के लिए अपने कोड को कम करना होगा। उदाहरण के लिए, निम्न स्क्रिप्ट भी 1M वस्तुओं को संसाधित करती है, लेकिन यह उन्हें 1000 वस्तुओं के बैच के रूप में प्रकाशित करती है, और प्रत्येक 1000 वस्तुओं के उत्तरों की प्रतीक्षा करती है। इसलिए यह बहुत कम मेमोरी की खपत करता है (संदर्भ में अधिकतम 1000 लंबित कमांड हैं)।
var redis = require("redis"),
publisher = redis.createClient();
function loop( callback ) {
var count = 0;
for ( i=0 ; i < 1000; ++i ) {
publisher.publish("rChat", i, function(err,rep) {
if ( ++count == 1000 )
callback();
});
}
}
function loop_rec( n, callback ) {
if ( n == 0 ) {
callback();
return;
}
loop( function() {
loop_rec( n-1, callback );
});
}
function main() {
console.log("Hello");
loop_rec(1000, function() {
console.log("stopped sending messages");
setTimeout(function(){publisher.end();},1000);
return;
});
}
publisher.ping(main)
setTimeout(function() {
console.log("Keeping console alive");
}, 1000000);
क्या स्मृति जारी की जा सकती है?
आमतौर पर, यह नहीं हो सकता। सभी C/C++ प्रोग्राम की तरह, node.js एक मेमोरी एलोकेटर का उपयोग करता है। जब मेमोरी को मुक्त किया जाता है, तो इसे सिस्टम को नहीं, बल्कि मेमोरी एलोकेटर को जारी किया जाता है। आम तौर पर, मेमोरी एलोकेटर सिस्टम को अप्रयुक्त मेमोरी को वापस देने में सक्षम नहीं होता है। कृपया ध्यान दें कि यह कोई लीक नहीं है, क्योंकि यदि प्रोग्राम एक नया आवंटन करता है, तो मेमोरी का पुन:उपयोग किया जाएगा।
एक C/C++ प्रोग्राम लिखना जो वास्तव में सिस्टम को मेमोरी जारी कर सकता है, में आम तौर पर एक कस्टम मेमोरी एलोकेटर डिजाइन करना शामिल होता है। कुछ C/C++ प्रोग्राम ऐसा करते हैं। उसके ऊपर, node.js में v8 के साथ एक कचरा संग्रहकर्ता शामिल है, इसलिए इसे स्मृति रिलीज नीति पर अतिरिक्त बाधाएं डालनी चाहिए।