我使用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();
当运行上面的代码时,我似乎得到了内存泄漏,因为我的内存很快就会填满。 我加载的图像文件越大,填满的越快。
我做错了什么?有没有办法'释放'图像变量?我试过把它归零。
答案 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();