मैं एक आवेदन जहाँ मैं क्रमिक रूप से एक सर्वर से एमपी 3 फ़ाइलों को डाउनलोड कर रहा हूँ है के बाहर आवंटित करने के लिए, अस्थायी रूप से अपने सर्वर में उन्हें भंडारण उन्हें ग्राहकों के लिए सीधे स्ट्रीमिंग तो, है, तो तरह मुक्त कर रहे हैं:NodeJS: कैसे बफ़र्स कि वी 8 स्मृति ढेर
function downloadNextTrack(){
var request = http.get('http://mp3server.com', function(response){
response.on('data', function(data) {
fs.appendFile('sometrack.mp3', data, function (err) {});
});
response.on('end', function(){
streamTrack('sometrack.mp3');
}
});
};
var clients = []; // client response objects are pushed to this array when they request the stream through a route like /stream.mp3
var stream;
function streamTrack(track){
stream = fs.createReadStream(track);
stream.on('data', function(data){
clients.forEach(function(client) {
client.write(data);
});
});
stream.on('end', function(){
downloadNextTrack(); // redoes the same thing with another track
}
};
जाहिर है इस कोड, बफ़र्स जो ओएस द्वारा मुक्त नहीं किया जा रहा है की एक बहुत कुछ पैदा कर रही है जब मैं 'मुक्त -M' कमांड चलाने के लिए, यह मैं (एप्लिकेशन चलाने का लगभग 4 घंटे के बाद प्राप्त होता है):
total used free shared buffers cached
Mem: 750 675 75 0 12 180
-/+ buffers/cache: 481 269
Swap: 255 112 143
'बफर' के तहत संख्या लगातार बढ़ती है (साथ ही साथ कैच एड मेमोरी) और ओएस स्पष्ट रूप से उस 180 एमबी को पुनः प्राप्त नहीं करता है, जब तक कि मेरा ऐप स्मृति और क्रैश से बाहर हो जाता है जब मैं ट्रैक की बिटरेट, नमूना दर, आईडी 3 जानकारी इत्यादि को सत्यापित करने के लिए एक छोटी सी प्रक्रिया को बढ़ाने की कोशिश करता हूं।
मैं अलग-अलग टूल पता लगाने के लिए अगर यह एक आंतरिक स्मृति रिसाव था और यह नहीं है (जैसे memwatch और nodetime के रूप में) का एक बहुत के साथ का निदान किया है, वी 8 स्मृति ढेर के साथ-साथ नोड आरएसएस भिन्न हो +/- 10 एमबी लेकिन लगातार रहने अधिकांश भाग के लिए जबकि ओएस फ्री मेमोरी कम हो जाती है और कम होती है (जब नोड प्रक्रिया शुरू होती है तो मेरे पास 350 एमबी मुफ्त मेमोरी होती है)।
मैंने कहीं पढ़ा है कि नोड द्वारा आवंटित बफर उदाहरणों में कच्ची मेमोरी तक सीधी पहुंच है और इसलिए वी 8 में उनके पास शक्ति नहीं है (जो इस तथ्य से जांचता है कि मुझे वी 8 ढेर से मेमोरी लीक नहीं मिल रहा है), बात यह है कि मुझे इन पुराने बफर से छुटकारा पाने के लिए एक रास्ता चाहिए। क्या यह संभव है? या मुझे हर 5 घंटों में या तो मेरे ऐप को पुनरारंभ करना होगा (या बदतर, अधिक रैम खरीदें!)?
पी एस। मैं उबंटू 10.04 पर नोड v0.8.16 चला रहा हूं।
हाय, हो सकता है यह एक बेवकूफ सवाल है, लेकिन, मुझे ठीक कर लें मैं गलत हूँ: आदेश 0) डाउनलोड ट्रैक # है 0 1) जब खत्म, सभी cliends 2) जब खत्म धारा, dwonload के लिए धारा # 1 ट्रैक जब आप ऐसा करते हैं यह प्रत्यावर्तन की तरह, सही है? पहली कॉल 'streamTrack' के अंदर आप एक धारा चर राशि (यह एक वैश्विक चर रहा है?) और, अंत में, आप 'downloadNextTrack' कहते हैं और एक अन्य धारा चर के साथ, फिर 'streamTrack' कहते हैं। यदि आप रिकर्सन का उपयोग करते हैं तो यह समस्या का स्रोत हो सकता है? –
उत्पादन कोड में यह स्ट्रीम चर एक सिंगलटन की तरह काम करता है, इसलिए जब कोई और स्ट्रीम शुरू होती है, तो इसे नए रीडस्ट्रीम पर फिर से सौंप दिया जाता है। यह एक वैश्विक चर की तरह काम करता है लेकिन यह वैश्विक वैरिएबल प्रति से नहीं है। – pedromtavares
'सेटटाइमआउट (फ़ंक्शन() {स्ट्रीमट्रैक (' somefile ');}, 0); 'का उपयोग करने का प्रयास करें। यह "रिकर्सिविटी" त्रुटि को मार देगा (मुझे पता है, थोड़ा विलंबित उत्तर) –