1

当我将一个大型视频文件从 MongoDB GridStore 对象传输到 Web 响应时,我遇到了内存泄漏问题。我正在使用快递。我的代码(为简洁起见省略了一些内容)如下:

// "res" is the response for this Express route.
// response header values are set outside this block
// gridstore, etc. are define above the part that counts, here
    gridStore.open(function (err, gs) {

    gs.seek(rangeObj.start, function (err, gs) {
        var current = 0,
            stream = gs.stream(true);

        stream.pipe(res);

        res.on("close", function () {
            console.log("socket closed");
            if(res){
                res.end();
                res = null;
            }
            if(gs){
                gs.close(function(){
                    gs.destroy();
                    gs = null;
                    if(db){
                        db.close(true, function(){
                            db = null;
                            gridStore = null;
                        });
                    }
                });
            }

        });

        stream.on("end", function () {
            console.log("stream ended");
            if(res){
                res.end();
                res = null;
            }
            if(gs){
                gs.close(function(){
                    gs = null;
                    if(db){
                        db.close(true, function(){
                            db = null;
                            gridStore = null;
                        });
                    }
                });
            }
        });

        stream.on("close", function(){
            console.log("stream closed");

            if(res){
                res.end();
                res = null;
            }
            if(gs){
                gs.close(function(){
                    gs = null;
                    if(db){
                        db.close(true, function(){
                            db = null;
                            gridStore = null;
                        });
                    }
                });
            }
        });
    });
});

如您所见,我正在努力清理自己。在我试图追捕这个问题的过程中,里面有很多不必要的东西。虽然,也许我错过了什么

视频流很好。但是,该过程需要越来越多的内存,似乎没有上限。即使在让进程空闲数小时后,它似乎也没有释放内存。

我试过暴露垃圾收集器并在响应关闭时运行(甚至每隔 5 秒)。我还尝试使用 --always-compact 标志执行节点进程。我在 Windows 7 和 Ubuntu 12.04(两者的节点 0.10.4)中都遇到了同样的问题。

4

0 回答 0