0

Node.js を使用して単純な静的ファイル サーバーを作成しようとしています。つまり、ビデオを video/mp4 (コンテンツ タイプ) として提供し、http 経由でダウンロードします。

ファイルが大きいことに注意してください(100MB以上)

静的ファイルの提供に推奨されているが、私の目的には役立たないパッケージ node-serve を使用してみました (そして、読み取りのブロックを使用しているようです)。

私のカスタム コードは機能しますが、リクエストごとにメモリ リークが発生し、10 ~ 20 のリクエストの後で次のエラーでプロセスがクラッシュします: FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory

更新ごとに、node.js のメモリ フットプリントが約 200 MB 増加しています。

node.js でのメモリ リークに関するほとんどの回答をここで見ましたが、プラットフォーム固有または組み合わせのように思われるため、どの回答も私の問題を解決していません。 node.js のバージョン 0.6+ 以降のこの問題...

Express で発生すると主張する投稿も見ました ( https://npmjs.org/package/express )

使用されるコード:

var fs = require('fs');
var http = require('http');
var mediaPath = '/mypublicdir';


function error404(res) {
    res.writeHead(404,{'content-type':'text/plain'});
    res.end();
} 

function err(str) {
    console.log(str);
}

var server = http.createServer(function (req,res){

  var filename,readStream;


  filename = mediaPath+req.url
  if (fs.existsSync(filename)) {
    readStream = fs.createReadStream(filename, {
        'flags': 'r',
            'mode': 0666,
            //'encoding': 'binary',
            'bufferSize': 8 * 1024      
    });

  } else {

    return;

  }

  readStream.on('data',function(data){
    res.write(data);
  });   

  readStream.on('open',function(data){
    console.log('Stream Open');
    res.writeHead(200,{'content-type':contentTypeSelector('video'),
    'Content-Transfer-Encoding' : 'binary',
    'Transfer-Encoding' : 'chunked'
    });
  });

  readStream.on('error',function(e){
    error404(res);
    err('Stream Read Error',{request:collectRequestMeta(req),filename:filename,error:e});
  });

  readStream.on('end',function(data){
  });

});


server.listen(8080);

各リクエストの完全な警告:

(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at Socket.EventEmitter.addListener (events.js:160:15)
    at Socket.Readable.on (_stream_readable.js:653:33)
    at Socket.EventEmitter.once (events.js:179:8)
    at TCP.onread (net.js:527:26)

これを書いているときに、次の問題を見つけました: NodeJS : 「EventEmitter メモリ リークが検出されました。11 個のリスナーが追加されました」をデバッグする方法

これはnodejsコアのバグであると述べています:(

不思議なことに、私の Windows マシンでは起こりません。レガシーバージョンv0.8.23をインストールする以外のアイデアをいただければ幸いです..

4

3 に答える 3

0

実際、ノード 0.10.4 で同じ問題が発生しました ( Node.js アプリが応答しなくなるのは、何度もすばやく連続してリロードすると) - 最善の解決策は 0.10.15 にアップグレードすることでした - バグは新しいリリースで修正されました。

于 2013-07-31T14:06:39.917 に答える
-1

GitHub の問題で説明されているように、これはノード v0.10.11 以降で修正されています。ノードでバグが発生した場合は、まず更新してみて、既に修正されているかどうかを確認してください。

于 2013-07-31T14:12:12.700 に答える