【问题标题】:Javascript Memory Leak in for loopfor循环中的Javascript内存泄漏
【发布时间】:2017-06-06 10:12:59
【问题描述】:

当我在 node.js 中运行以下代码时,我收到以下错误消息:

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
}

【问题讨论】:

  • 您的文件数组的长度是多少?在第一段代码中,您使用了两个 for 循环,这可能会同时刷新太多请求,从而导致内存不足
  • 500 个文件。每个约1.8mb
  • 您可以做的就是不要将所有文件一起刷新。你可以做的是使用 async.eachSeries 来控制刷新请求的循环。
  • 谢谢,我会试试看是否有帮助。

标签: javascript node.js memory-leaks garbage-collection


【解决方案1】:
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');
}

【讨论】:

  • 如果你使用async,那么你不应该同步使用fs模块。
  • 您也可以异步使用 fs。我所做的只是控制上层循环,因此没有刷新太多请求。 @Bergi。有很多方法可以在 readFile 函数 async 和 sync 中编写代码,是的,我同意异步文件读取会更好地工作,并且不会有任何内存泄漏问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
相关资源
最近更新 更多