内存有效的方式来复制数组

时间:2015-05-31 23:05:45

标签: javascript arrays node.js memory

所以基本上我正在尝试找到一种内存有效的方法来复制数组。假设我们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。

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

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。如果这是一个大阵列,内存摄入将是巨大的。有没有办法做到这一点,考虑到记忆效率?

1 个答案:

答案 0 :(得分:1)

您的分析技术不正确。

我以与您相同的方式创建了一个数组,并使用与您相同的ICollection<Controller>方法创建了“克隆”,这里是结果

enter image description here

因为你可以看到它是由2个引用保留的相同数组(仅需约2.06Mb)。

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

相关阅读:

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