发现一个非常有趣的情况,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。
对此可以解释什么?
答案 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个字节的内存,所以那里“只是”一个重要的每个对象开销。
如果你需要这样的东西,我建议你分配一个2 * 10000000个项目的单Float64Array
个并编入索引。 (FWIW,我只是尝试过:单个2亿个项目的Float64Array消耗600兆字节的内存以及近乎即时的分配和执行。)