Node和RxJs:如何避免长进程中的内存泄漏?

时间:2016-04-16 21:03:39

标签: node.js memory memory-leaks rxjs

我正在编程一个需要很长时间才能运行的流程,并且我正在寻找优化已用内存

我有一段随时间推移的数据流,我想要一种方法来清理这些数据并在流完成时声明变量。有什么想法吗?

我已经设置了一个问题的快速示例:

var source = Rx.Observable.interval(100)
                         .take(20)
                         .map((x) => {
                             let onlyTrash = _.range(1000000);
                             return x;
                         });

let subscription = source.subscribe(
    x => console.log(getMemoryUsage()),
    err => console.log('Error: ' + err),
    () => console.log('Completed: ' + getMemoryUsage())
);

我无法在小提琴中显示它,因为它引用了进程以获取内存使用

如果您运行此示例,您会注意到内存使用量在每个滴答中都在增加,但在完成时不会减少,这是问题

以下是getMemoryUsage函数的示例,如果您想在节点中尝试它

var lastMemoryUsageRegister;
function getMemoryUsage() : string {
    var memoryUsage : string;
    if (!lastMemoryUsageRegister) {
        memoryUsage = process.memoryUsage().rss.toString();
    } else {
        let diff = process.memoryUsage().rss - lastMemoryUsageRegister;
        memoryUsage = (diff > 0 ? '+' : '') + diff;
    }
    lastMemoryUsageRegister = process.memoryUsage().rss;
    return memoryUsage;
}

1 个答案:

答案 0 :(得分:1)

你可以把你的垃圾包裹起来'在另一个Observable中并使用Disposable进行清理,如下所示:

.flatMap((x) => {

  return Rx.Observable.create(obs => {
    let onlyTrash = _.range(1000000);

    let disposable = Rx.Disposable.create(() => {
      onlyTrash = undefined; // free up reference
    });

    obs.onNext(x); 
    obs.onCompleted();

    return disposable;
  });

});

请务必将其更改为flatMap,而不仅仅是map