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をインストールする以外のアイデアをいただければ幸いです..