我有一段随时间推移的数据流,我想要一种方法来清理这些数据并在流完成时声明变量。有什么想法吗?
我已经设置了一个问题的快速示例:
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;
}
答案 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