Node.js中稀疏数组的内存消耗
我写了一个生成数组的小程序,运行时间相当长(几乎永远;-)):
var results = []; var i = 1; while (true) { console.log(i++); results.push([]); }
当我创build一个长度为i
的稀疏数组而不是一个空数组时,程序崩溃得相当快:
var results = []; var i = 1; while (true) { console.log(i); results.push(new Array(i++)); }
其实我起床到i
等于17424,然后我得到一个错误消息告诉我
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory Abort trap: 6
和Node.js带我回到控制台。 由于唯一的区别是第二个产生比第一个更大的空数组,所以这意味着长度为n
的空稀疏数组占用长度为1
的空数组的空间的n
倍。
我是对的这个(具体到Node.js)?
还有一个问题:如果我跑步
var results = []; var i = 1; while (true) { console.log(i); var temp = []; temp[i++] = i; results.push(temp); }
然后我起床到1286175,然后再次崩溃:
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - process out of memory Abort trap: 6
为什么这个行为与其他两个select不同?
PS:我使用Node.js 0.12.0在OS X上运行这个。
当你声明一个大小的数组
Array(1024);
你这样做是为了给1024个元素分配空间。 它必须预先分配这个空间,因为这种声明数组的forms是一个优化说明
“我需要你保留1024个位置,这样你就不会不断地调整arrays的大小,因为我把更多的元素放在它上面”。
正如你可能知道的那样,使用简单的[]
声明一个数组依然可以让你无限数量的元素加载到它上面,但是这个数组默默地在后台被resize(很可能是memcpy()
)来允许这种行为。
编辑:
你在第二个例子中获得更高迭代的原因是因为你正在使用一个稀疏数组。 用一个稀疏的数组做
var arr = [] arr[1000000] = 1;
这并不意味着你的数组现在在内存中使用了1,000,000个条目。 将其与密集arrays进行对比
var arr = Array(1000000);
它明确告诉运行库保留一个可以在内存中存储1000000个条目的数组。
相关的StackOverflow问题: https ://stackoverflow.com/a/1510842/276949
节点中的JS引擎V8使用4个字节作为看似空arrays中的每个元素。 找出这个问题的最佳方法是在Chrome中创build空数组,并使用分析器来查看该arrays已经用完了多less额外的大小。 有关如何执行此操作的详细信息,请参阅https://developer.chrome.com/devtools/docs/heap-profiling