正在从对象数组中删除属性,会影响内存



我正在节点应用程序上处理一个庞大的对象数组,有时我想从数组中的所有对象中删除两个属性。

同时,我正在测量节点内存对rss(Residente Set Size(的影响。

我发现,仅仅删除它们就会消耗大量内存。

例如,它实际上要大得多,有很多物体。json的文件大小为200MB。

[
{
keep: 'foo',
prop1: 'remove',
prop2: 'remove'
},...
]

从500MB到1000MB的消耗最大

const clean = original.map((obj) => {
delete obj.prop1
delete obj.prop2
return obj
})

这也消耗了很多,也大约1000MB

original.forEach((obj) => {
delete obj.prop1
delete obj.prop2
})

这是最少的,大约650MB

const clean = original.map(({ prop1, prop2, ...obj }) => obj)

但如果我根本不删除它们,那么它的消耗量就不会超过原来的500MB。发生了什么事?不应该删除属性使内存更轻吗?

您可以使用您提供的任何一个.map()调用(它们比.forEach()更快(。

完成删除后,只需将原始变量设置为null即可。这将允许JS引擎将此变量标记为垃圾回收,并将其从内存中删除。你不会立即看到结果,因为我们不知道GC何时运行,也无法控制它。但内存会很快被回收。

像这样:

const clean = original.map((obj) => {
delete obj.prop1
delete obj.prop2
return obj
})
original = null;
const clean = original.map(({ prop1, prop2, ...obj }) => obj);
original = null;

这里的问题是,除了我提出的之外,我们作为网络开发人员对内存消耗没有任何控制权。在内部,V8引擎决定如何在内存中把东西放在一起,所有的内存管理问题都归它处理

最新更新