内存高效的方法来复制一个数组
所以基本上我试图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;
现在,当我执行一个arr1
到arr2
的副本:
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/
相关阅读:
总结一下:你的假设从一开始就是错误的。