2017-01-21 13 views
0

のために、私は次のようなエラーメッセージが出ます:私はNode.jsの中で、次のコードを実行するとJavascriptのメモリリークがループ

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory 

//Running this code causes program to run out of memory. 
for(var i = 0; i < files.length; i++){ 
     readFile(files[i]); 
} 

//log each line of file to console 
function readFile(data){ 
    var lines = fs.readFileSync(data).toString().split('\n'); 
    for(var k = 0; k < lines.length; k++){ 
     console.log(lines[k]); 
    } 
} 

をしかし、私はreadFileの機能を変更し、ための蚊帳の外console.log(lines[k])を取る場合致命的なエラーはなくなります。何故ですか?そして、元のコードを修正してメモリ不足を防ぐ方法はありますか?

function readFile(data){ 
    var lines = fs.readFileSync(data).toString().split('\n'); 
    var string = '' 
    for(var k = 0; k < lines.length; k++){ 
     //console.log(lines[k]); 
     string += lines[k]; 
    } 
    console.log(string); //log the same string outside the loop and the fatal error goes away 
} 
+1

ファイルの配列の長さは何ですか?最初のコードでは2つのforループを使用しており、多くのリクエストを一緒にフラッシュしてメモリ不足の原因となります –

+0

500ファイル。それぞれの約1.8mb –

+0

あなたができることは、すべてのファイルを一緒にフラッシュしないことです。あなたができることは、flushリクエストからループを制御するasync.eachSeriesを使うことです。 –

答えて

0
do npm install async --save 
var async = require('async'); 

async.eachSeries(files , filesIteration , finishIteration); 

function filesIteration(file , callBack){ 
    readFile(file , callBack); 
} 


function readFile(data , cb){ 
    var lines = fs.readFileSync(data).toString().split('\n'); 
    for(var k = 0; k < lines.length; k++){ 
     console.log(lines[k]); 
     if(k === lines.length - 1){ 
      cb(); 
     } 
    } 
} 

function finishIteration(){ 
    console.log('all files processed'); 
} 
+0

'async'を使うと、' fs'モジュールを同期して使うべきではありません。 – Bergi

+0

あなたはfsを非同期的に使うこともできます。あまりにも多くのリクエストがフラッシュされないように、上位ループを制御しています。 @Bergi。 readFile関数でコードを書くには多くの方法があります。非同期と同期の両方がうまくいきます。私は非同期ファイルの読み込みがうまくいくと思います。 –

関連する問題