[英]Memory efficient way to copy an array
所以基本上,我试图找到一种内存有效的方式来复制数组。 假设我们有arr1
,其中包含500000个值true
元素:
var arr1 = [];
for (var i = 0; i < 500000; i++) {
arr1[i] = true;
}
在Node.js中,大约占用32.3 MiB(包括Node启动时的18.7 MiB)。 现在,很明显,当您引用arr1
,将不会分配内存:
var arr2 = arr1;
现在,当我将arr1
复制到arr2
:
var arr2 = arr1.concat();
该过程占用36.2 MiB,所以大约4 MiB。
事情是这样的:无论我要清空还是擦除原始数组,分配给该数组的内存都不会被垃圾收集器释放或占用。 假设我有:
arr1.length = 0;
delete arr1;
arr1 = undefined;
arr1 = arr2.concat();
因此,该过程现在占用了39.8 MiB。
那么,这里到底发生了什么? 是否存在对Node(或其他JS引擎)试图向我隐藏的原始数组的秘密引用? 这是更多代码:
arr2.length = 0;
delete arr2;
arr2 = undefined;
arr2 = arr1.concat();
它将简单地“清空” arr2
以便可以保存arr1
的副本。 您可能已经知道,我正试图来回传输数组的内容,但是现在该过程占用了43.5 MiB。 如果这是一个很大的数组,那么内存占用将是巨大的。 有没有办法做到这一点,同时考虑内存效率?
您的分析技术不正确。
我以与您相同的方式创建了一个数组,并使用与您相同的.concat()
方法创建了一个“克隆”,这是结果
因此,您可以看到它是由2个引用保留的同一数组(仅占用〜2.06Mb)。
对应的jsfiddle: http : //jsfiddle.net/6o0h0r1j/
相关阅读:
总结一下:您的假设从一开始就是错误的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.