我有一个循环填充的嵌套对象数组。
类似的东西:
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?
答案 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
我想添加的解决方案可能会有所不同,具体取决于您何时计划使用这些对象或在逻辑中处理它们。