2017-01-21 12 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

что длина вашего массива файлов? в первом фрагменте кода вы используете два для петель, которые могут сбрасывать много запросов, одновременно вызывая нехватку памяти –

+0

500 файлов. Каждый около 1,8 МБ –

+0

, что вы можете сделать, это не объединить все файлы вместе. Что вы можете сделать, это использовать 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 async, и синхронизация будет работать, и да, я согласен, что чтение async-файла будет работать лучше, и не будет никаких проблем с утечками памяти –