Estoy procesando una gran variedad de objetos en una aplicación de nodo y, en algún momento, quiero eliminar dos propiedades de todos los objetos de la matriz.
Al mismo tiempo estoy midiendo el impacto de la memoria del nodo en rss (Residente Set Size).
Lo que estoy encontrando es que solo el acto de eliminarlos consume mucha memoria.
Ejemplo, en realidad es mucho más grande y con muchos objetos. El tamaño del archivo de json es de 200 MB.
[ { keep: 'foo', prop1: 'remove', prop2: 'remove' },... ]Esto consume la mayor parte de 500 MB va a 1000 MB
const clean = original.map((obj) => { delete obj.prop1 delete obj.prop2 return obj })Esto también consume mucho, también alrededor de 1000 MB
original.forEach((obj) => { delete obj.prop1 delete obj.prop2 })Este es el que menos consume, ronda los 650 MB
const clean = original.map(({ prop1, prop2, ...obj }) => obj)Pero si no los elimino en absoluto, entonces no consume más de los 500 MB originales. ¿Qué está pasando? ¿No debería quitar propiedades aligerar la memoria?
Puede usar cualquiera de las llamadas .map() que proporcionó (son más rápidas que .forEach() ).
Cuando haya completado la eliminación, simplemente establezca la variable original en nulo. Esto permitirá que el motor JS marque esta variable para la recolección de basura y se eliminará de la memoria. No verá el resultado de inmediato, ya que no tenemos idea de cuándo se ejecutará GC y no podemos controlarlo. Pero la memoria será recuperada muy rápidamente.
Como esto:
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;El problema aquí es que nosotros, como desarrolladores web, no tenemos ningún control sobre el consumo de memoria aparte de lo que he propuesto. Internamente, el motor V8 decide cómo se organizan las cosas en la memoria y todos los problemas de gestión de la memoria quedan relegados a él.