2017-01-21 58 views
0

當我在node.js中運行下面的代碼我收到以下錯誤信息:JavaScript中的內存泄漏在for循環

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])出來的for循環,致命的錯誤消失。這是爲什麼?我怎樣才能修復原始代碼,使其停止內存不足?

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

什麼是你的文件數組的長度?在第一段代碼中,您使用了兩個for循環,這些循環可能會同時沖刷很多請求,從而導致內存不足 –

+0

500個文件。每個約1.8mb –

+0

你可以做的是不要衝洗所有文件在一起。你可以做的是使用async.eachSeries來控制flush請求的循環。 –

回答

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函數中編寫代碼異步和同步都可以工作,是的我同意異步文件讀取將工作得更好,並且不會是任何內存泄漏的通道 –