为什么Array of Float64Array在Node.js中占用了这么多内存?

时间:2018-02-22 14:24:27

标签: arrays node.js memory memory-management

发现一个非常有趣的情况,node.js 6.11.0,Win 10.运行此代码后

function rand() {return Math.floor(Math.random()*10);}
let s = new Array(10000000).fill(0).map(a => new Float64Array([rand(), rand()]));

并且几次调用global.gc(),node.js环境占用了1,7GB的空间。我没有解释这个 - Float64Array的两个数字占用16bytes,倍10000000是~160MB。即使你假设数组s的每个元素实际上是一个指向Float64Array的指针,这是另外8个字节,它确实是240MB,但肯定不是1,7GB。

对此可以解释什么?

1 个答案:

答案 0 :(得分:1)

查看

node --inspect(节点9.5.0)输出
function rand() {
    return Math.floor(Math.random()*10);
}
const arr = [];
for(var i = 0; i < 1000000; i++) {
    arr.push(new Float64Array([rand(), rand()]));
    if(i % 1000 == 0) {
        console.log(i);
    }
}

global.x = arr;

看起来每个Float64Array的2个项目都需要208个字节的内存,所以那里“只是”一个重要的每个对象开销。

Screenshot of Chrome inspector

如果你需要这样的东西,我建议你分配一个2 * 10000000个项目的单Float64Array个并编入索引。 (FWIW,我只是尝试过:单个2亿个项目的Float64Array消耗600兆字节的内存以及近乎即时的分配和执行。)