2016-02-04 5 views
5

द्वारा बनाई गई फ़ाइलों को बंद नहीं कर रहा है, मेरे सर्वर पर, जब भी कोई उपयोगकर्ता हमारी सेवा का उपयोग करता है तो हमें सर्वर से उनके लिए JSON फ़ाइल लेनी होती है। मैं अपने स्वयं के फ़ंक्शन के अंदर fs.createReadStream() का उपयोग कर ऐसा करता हूं।node.js fs.createReadStream()

function getJSONFromServer(filepath, callback){ 
    var data = fs.createReadStream(filepath); 
    data.on('error', function (error) { 
     console.log("Caught", error); 
     callback(undefined, error); 
    }); 
    var jsonFile = ""; 
    data.on('data', function(chunk) { 
     jsonFile += chunk; 
    }); 
    data.on('end', function() { 
     var jsonData = JSON.parse(jsonFile); 
     callback(jsonData); 
     data.destroy(); 
     data.close(); 
    }); 
} 

यह काम करता है, लेकिन यह फ़ाइल से कनेक्शन बंद नहीं करता है। तो 1024 फ़ाइलों (मेरे सर्वर पर सीमा) पढ़ने के बाद, Node.js त्रुटि EMFILE, too many open files त्रुटि उत्पन्न करेगा। तो मुझे अपने नोड.जेएस सर्वर को मारना है, इसे फिर से खोलें और इससे "खुली फाइलें" साफ़ हो जाएंगी।

मैं lsof -i -n -P | grep nodejs द्वारा खुली फ़ाइलों की मात्रा की जांच करता हूं। यह इस तरह कुछ प्रदर्शित करता है:

nodejs 13707  node 10u IPv4 1163695  0t0 TCP 127.0.0.1:55643->127.0.0.1:27017 (ESTABLISHED) 
nodejs 13707  node 11u IPv4 1163697  0t0 TCP 127.0.0.1:55644->127.0.0.1:27017 (ESTABLISHED) 

खुली कई फाइलों के लिए।

मैंने सुंदर-एफएस का उपयोग करने का प्रयास किया है। मैंने stream.destroy() और stream.close() पर कॉल करने का प्रयास किया है, लेकिन मुझे अभी भी एक ही समस्या मिलती है। मेरा सर्वर अनिवार्य रूप से एक टिकिंग टाइम बम है क्योंकि हमें उपयोगकर्ताओं का भारी, स्थिर प्रवाह मिलता है और कई उपयोगकर्ताओं ने इसे कनेक्ट करने के बाद ही काम करना बंद कर दिया है।

इसके अलावा, ulimit -n [open file amount] काम नहीं करता है, और यहां तक ​​कि अगर ऐसा होता है, तो यह एक दीर्घकालिक समाधान नहीं है क्योंकि मैं अपने फाइल कनेक्शन बंद करना चाहता हूं और किसी भी कारण से खुला नहीं रहना चाहता हूं।

मैं नोड.जेएस संस्करण v0.10.25, Ubuntu 15.04 (GNU/Linux 3.19.0-42-generic x86_64) और graceful-fs का नवीनतम संस्करण उपयोग कर रहा हूं, तो इससे मदद मिलती है!

आपकी सहायता के लिए धन्यवाद।

+0

शायद मुझे सुझाव है कि आप ['fs.readFile()'] (https://nodejs.org/api/fs.html#fs_fs_readfile_file_options_callback) का उपयोग करें जो स्वचालित रूप से आपके लिए संलग्न संपूर्ण स्ट्रिंग करेगा और सभी त्रुटियों को सही तरीके से संभाल देगा शर्तेँ? शायद यह एक विकल्प नहीं था जब आपने सवाल पूछा, लेकिन यह आपको यहां कई लाइनों को बचाएगा ;-)। – binki

उत्तर

3

यह अब तक की सबसे बेवकूफ गलती होनी चाहिए। भले ही, जवाब यहाँ है। मुझे आशा है कि मैं किसी को इस त्रुटि से निपटने से बचा सकता हूं और लगभग अपने बालों को फटकार कर सकता हूं।

मैं nodejs के साथ अपना ऐप चला रहा था और node नहीं था। बाहर निकलता है, अगर आप nodejs --version करते हैं, तो यह संभवतः एक पुराना संस्करण लौटाएगा, जो मेरे लिए v0.10.25 था। node --version हालांकि v5.6.0 था। जाहिर है, संस्करणों में इस विशाल कूद से कुछ सामान ठीक हो जाएंगे, इसलिए मैंने के बजाय node app.js के साथ ऐप चलाया और मुझे तब तक कोई समस्या नहीं थी। अब केवल 6 खुली फाइलें हैं, जबकि हमारे पास समय के साथ 1000 से अधिक था।

अरे यह मेरी छाती को बंद करने के लिए अच्छा लगता है।