私のサーバーでは、ユーザがサービスを使用するたびに、サーバから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
を生成します。それではNode.jsサーバーを終了して、もう一度開いて "オープンファイル"をクリアしなければなりません。
ファイルのオープン数を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
を使用しています。
ご協力いただきありがとうございます。
['fs.readFile()'](https://nodejs.org/api/fs.html#fs_fs_readfile_file_options_callback)を使用することをお勧めします。追加する文字列全体を自動的に処理し、すべてのエラーを適切に処理します条件?たぶん、あなたが質問したときにこれはオプションではなかったかもしれませんが、ここにたくさんの行を保存します;-)。 – binki