节点和RxJs:我怎样才能避免一个漫长的过程内存泄漏?

我正在编写一个需要很长时间运行的进程,我正在寻找优化已用内存的方法

我有一个随着时间stream逝的数据stream,我想要一个方法来清理这些数据,并在stream完成时声明variables。 有任何想法吗?

我已经设定了一个问题的简单例子:

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

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

如果你运行这个例子,你会注意到内存的使用在每个tick中增加,但是在完成时不会减less, 这是问题所在

这里是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; } 

你可以将你的“垃圾”包装在另一个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