![](/img/trans.png)
[英]Replacing fs.readFile with fs.createReadStream in Node.js
[英]Node.js not closing files created by fs.createReadStream()
在我的服務器上,每次用戶使用我們的服務時,我們都必須從服務器上為其獲取JSON文件。 我通過在我自己的函數中使用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
。 然后,我必須殺死我們的Node.js服務器,再次打開它,這將清除“打開的文件”。
我檢查由lsof -i -n -P | grep nodejs
打開的文件數量lsof -i -n -P | grep nodejs
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)
打開的文件數量最多。
我試過使用graceful-fs。 我嘗試調用stream.destroy()
和stream.close()
,但是仍然遇到相同的問題。 我的服務器本質上是一個定時炸彈,因為我們獲得了大量穩定的用戶流,並且在連接了如此多的用戶之后,它將停止工作。
另外, ulimit -n [open file amount]
不起作用,即使可以,但這也不是長期解決方案,因為我希望文件連接關閉並且無緣無故打開。
我正在使用Node.js版本v0.10.25
, Ubuntu 15.04 (GNU/Linux 3.19.0-42-generic x86_64)
和最新版本的graceful-fs
如果有幫助!
感謝您的任何幫助,您可以提供。
這一定是我犯過的最愚蠢的錯誤。 無論如何,這就是答案。 我希望我可以避免有人處理此錯誤並幾乎將他們的頭發扯掉。
我正在使用nodejs
而不是node
運行我的應用程序。 事實證明,如果執行nodejs --version
,它可能會返回一個非常舊的版本,對我來說是v0.10.25
。 node --version
是v5.6.0
。 顯然,版本的大量增加會解決一些問題,因此我使用node app.js
而不是nodejs app.js
運行該應用程序, nodejs app.js
我再也沒有遇到任何問題。 現在只有6個打開的文件,而隨着時間的流逝我們已經超過了1000個。
媽的,把它從我的胸口拿下來感覺很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.