gpt4 book ai didi

node.js - Node 和 RxJ : How can I avoid a memory leak on a long process?

转载 作者:太空宇宙 更新时间:2023-11-03 22:13:05 27 4
gpt4 key购买 nike

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

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

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

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 中显示它,因为它引用进程来获取内存使用情况

如果您运行此示例,您会注意到内存使用量在每个周期中都在增加,但在完成时并没有减少,这就是问题

如果您想在 Node 中尝试,这里是 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

关于node.js - Node 和 RxJ : How can I avoid a memory leak on a long process?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36669721/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com