首页 > 解决方案 > 从对象数组中删除属性,内存影响

问题描述

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

同时我正在测量节点内存对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。到底是怎么回事?不应该删除属性使内存更轻吗?

标签: javascriptnode.js

解决方案


您可以使用.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;

这里的问题是,作为 Web 开发人员,除了我所提议的之外,我们对内存消耗没有任何控制权。在内部,V8 引擎决定如何将事物放在内存中,所有内存管理问题都归它处理。


推荐阅读