node.js readFile内存泄漏

时间:2014-06-27 11:29:29

标签: javascript node.js file-io memory-leaks

我使用node.js每秒读取一个图像。我的想法是稍后将其推送到Web浏览器,使其成为一个简单的流。代码如下所示:

var fs      = require("fs");
var intervalTimerObj;

function startStream() {
    if(!intervalTimerObj) {
        intervalTimerObj = setInterval( updateStream  , 1000);
    }
}

function updateStream(){
    fs.readFile( __dirname + "/pic.jpg", function(err, image) {

    });
}

startStream();

当运行上面的代码时,我似乎得到了内存泄漏,因为我的内存很快就会填满。 我加载的图像文件越大,填满的越快。

我做错了什么?有没有办法'释放'图像变量?我试过把它归零。

2 个答案:

答案 0 :(得分:1)

这是一种更好的方法。此处不应使用setInterval(),因为它可能导致同时执行同一任务。请改用setTimeout()。理想的地方是readFile()的回调:

var fs            = require("fs");
var timeoutHandle = null;

function startTimeout() {
  stopTimeout();
  timeoutHandle = setTimeout(updateStream, 1000);
}

function stopTimeout() {
  clearTimeout(timeoutHandle);
}

function updateStream(){
    fs.readFile( __dirname + "/pic.jpg", function(err, image) {
      // ...

      startTimeout(); // Make sure this line is always executed
    });
}

startTimeout();

您还需要确保在处理之后不要对image提及任何引用,否则V8的垃圾收集器不会释放图像数据,从而泄漏内存

答案 1 :(得分:0)

试试这个

function startStream() {
    if(!intervalTimerObj) {
        intervalTimerObj = setTimeout( updateStream  , 1000);
    }
}

function updateStream(){
    fs.readFile( __dirname + "/pic.jpg", function(err, image) {
       //OK file is read
       //do yoyr stuff with it....
       // Now start next read
       startStream()
    });
}

startStream();