Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js readFile内存泄漏_Javascript_Node.js_File Io_Memory Leaks - Fatal编程技术网

Javascript node.js readFile内存泄漏

Javascript node.js readFile内存泄漏,javascript,node.js,file-io,memory-leaks,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 updateS

我使用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();
当运行上面的代码时,我的内存很快就被填满了,似乎出现了内存泄漏。 我加载的图像文件越大,填充的速度就越快

我做错了什么?是否有某种方法可以“释放”图像变量?我已尝试将其置零。

试试这个

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();

这是一个更好的方法<此处不应使用code>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的垃圾收集器将无法释放图像数据,从而导致内存泄漏。

fs.readFile
回调上读取完图像后,不要使用
setInterval
更新流。最好先读取一个图像,然后如果您确实需要1000毫秒的时间间隔来使用
setTimeout
开始下一次读取,只需尝试使用setTimeout即可。仍然在偷我所有的记忆你为什么要每1000毫秒做一次呢?这个想法是每秒捕获一张图片,然后通过socket.iots将其推送到web浏览器上获取代码。不过,我的记忆力一直在提高。我正在用top命令(使用linux)监控ram,但它从未停止运行。我猜您正在某个地方进入循环调用循环。检查您的代码,如果可能的话进行调试,并考虑更好的模式。如果新的问题回来后,张贴一个问题。这段代码就是这样的模式。2个函数正在互相调用我正在运行startTimeout函数,但内存始终没有释放。每次它加载一个图像,我的记忆就会增强。startTimeout对您有效吗?我已经对您的解决方案进行了长期测试,似乎内存使用率稳定在约40%(200mb)的内存使用率上。这是意料之中的事吗?谢谢你的代码,顺便说一句!是的,这似乎很正常。在循环中处理大量数据时,需要非常小心。很乐意帮忙!