内存高效的方法来复制一个数组

所以基本上我试图find一个内存有效的方法来复制一个数组。 假设我们有arr1 ,其中包含500000个true值元素:

 var arr1 = []; for (var i = 0; i < 500000; i++) { arr1[i] = true; } 

在Node.js中,占用大约32.3 MiB(包括节点启动时的18.7 MiB)。 现在,很明显,当你引用arr1 ,将不分配内存:

 var arr2 = arr1; 

现在,当我执行一个arr1arr2的副本:

 var arr2 = arr1.concat(); 

这个过程占用36.2 MiB,所以大约4 MiB。

这里是:不pipe我做什么来清空或擦除原始数组,分配给该数组的内存都不会被垃圾收集器释放或拾取。 假设我有:

 arr1.length = 0; delete arr1; arr1 = undefined; arr1 = arr2.concat(); 

多亏了这一点,这个过程现在占据了39.8 MiB。

那么这里究竟发生了什么? 是否有一些秘密引用原始数组的节点(或任何JS引擎)试图隐藏我? 这是更进一步的代码:

 arr2.length = 0; delete arr2; arr2 = undefined; arr2 = arr1.concat(); 

这将简单地“清空” arr2因此它可以保存arr1的副本。 正如你可能已经知道的那样,我试图将数组的内容来回传输,但现在这个过程占用了43.5 MiB。 如果这是一个庞大的arrays,记忆摄入量将是巨大的。 有没有办法做到这一点,考虑到记忆效率?

你的分析技术是不正确的。

我以同样的方式创build了一个数组,并创build了一个与您的.concat()方法相同的“克隆”,这里是结果

在这里输入图像说明

所以你可以看到它是2个引用保留的同一个数组(仅需〜2.06Mb)。

相应的jsfiddle: http : //jsfiddle.net/6o0h0r1j/

相关阅读:

总结一下:你的假设从一开始就是错误的。