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

Node and RxJs: How can I avoid a memory leak on a long process?

我正在编写一个需要很长时间的进程 运行ning,我希望优化已用内存

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

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

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

我无法在 Fiddle 中显示它,因为它引用进程以获取内存使用情况

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

这里有一个 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;
}

你可以将你的 'trash' 包装在另一个 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