2016-02-04 38 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を生成します。それでは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.25Ubuntu 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 --versionv5.6.0でした。明らかに、バージョンのこの大規模なジャンプはいくつかのものを修正するので、私はnodejs app.jsの代わりにnode app.jsでアプリを走らせました。現在、オープンファイルは6つしかありませんが、以前は1000を超えるファイルがありました。

私の胸の外にこれを持っているのが良い気がする。

関連する問題