节点和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