销毁嵌套在数组中的对象

时间:2018-03-29 11:14:13

标签: node.js

我有一个循环填充的嵌套对象数组。

类似的东西:

var myArray = [
   object1: {
       //lots of nesting
   },
   ...
]

现在我对此运行一个循环,并希望在每次循环迭代后从索引1覆盖,例如:

function getNestedObject(i) {
    //some object creation code
}

for (i = 0 ; i< 50000 ; i++) {
    var item = _.cloneDeep(getNestedObject(i));
    myArray.push (item);
    if (myArray.length > 20) {
        //delete all elements and start pushing from scratch
        //Do i need to additionally destroy the items within each of these 20 objects being overwritten to avoid memory overflow?
        myArray.splice(0,20);
    }
}

这是为了避免由于堆空间被对象数组吞噬而导致堆溢出。

我是否需要另外销毁被覆盖的这20个对象中的每一个中的项目,以避免内存溢出或在此范围内发生自动gc?

1 个答案:

答案 0 :(得分:1)

我不确定数组中的实际对象有多大,但你可以尝试使用lodash chunk方法将数组划分为多个数组,如果你已经有一个数组 >如下所示的物体。

为此,请使用lodash chunk方法。

_.chunk(['a', 'b', 'c', 'd'], 2);
// => [['a', 'b'], ['c', 'd']]

_.chunk(['a', 'b', 'c', 'd'], 3);
// => [['a', 'b', 'c'], ['d']]

_.chunk(myArray, 20);
// [[arr1],[arr2] ... ]
// This will produce your resultantn arrays

现在,回答你关于进程内存的问题是,如果myArray的大小变大,你将它拆分为20个更小的数组。 在您创建数组的过程中,即使您删除或拼接原始数组,在拆分过程结束时您仍然拥有已在内存中拆分的对象,因此没有削减成本说。你可能最终得到memory overflow

Try writing the split arrays to a temp file and read it back when needed.


    for (i = 0 ; i< 50000 ; i++) {
        var item = _.cloneDeep(getNestedObject(i));
        myArray.push (item);
        if (myArray.length > 20) {  
            //appeand the array temp file
            fs.writeFileSync('myTemp.json', json, 'utf8');
            //clear the temp array
            myArray = [];
        }
        //nothing subastanital in memory at this point
     }

note* above is pseudo code for explanation may need to change as per requirements

我想添加的解决方案可能会有所不同,具体取决于您何时计划使用这些对象或在逻辑中处理它们。