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
我正在编写一个需要很长时间的进程 运行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