javascript中的大型数组是不是有项目限制
Posted
技术标签:
【中文标题】javascript中的大型数组是不是有项目限制【英文标题】:Is there an item limit for large arrays in javascriptjavascript中的大型数组是否有项目限制 【发布时间】:2016-09-22 03:35:28 【问题描述】:已阅读此Question,但没有得到可以理解的答案。
我有一个预定义大小的数组new Array(105119296)
。
然后在定义数组之后,我开始一个循环来为每个索引填充一个值。
此过程通常在 webworker 中运行,但在那里以及直接在浏览器中崩溃。
在Chrome Mac 50.0.2661.102 (64-bit)
中进行 11184811 次迭代后,执行崩溃。
下面的脚本重现了这种情况。
var len = 105119296;
var arr = new Array(len);
for(var i=0;i<len;i++)
var data = 0;// Math.round(Math.random()*10);
if(i>11184810)
console.log(i + '->' + data);
// At 11184811 Chrome dev tool crashes
arr[i] = data;
console.log('done');
我的一般问题是:
javascript 中数组可以容纳的大小是否有限制?如果不是,为什么这样的事情在网络工作者中不能正常运行,这是为了我理解会阻塞浏览器视图的繁重任务。
【问题讨论】:
在 Chrome 中,最大数组大小介于 1e9 和 1e10 之间。 而崩溃与数组大小无关,与迭代次数有关。它也会因正常循环而崩溃。 你为什么要在 JS 中遍历 1 亿个项目?你真的在使用最好的方法吗? 不管数组的最大长度是多少,我确信数组占用多少 RAM 是有限制的。所以你可以有一个带有length = 1
的数组,但如果该 1 项占用大量 RAM,那么它可能无法工作......
我的 chrome 崩溃了,或者只是没有使用 for 循环加载我的脚本,该循环遍历包含数百万个元素的数组。似乎 999,999 有效,但 1,000,000 崩溃?
【参考方案1】:
我在一个类似的问题中找到了这个答案: Maximum size of an Array in Javascript
“它变得迟缓”之前的最大长度完全取决于您的目标机器和您的实际代码,因此您需要在那个(那些)平台上进行测试,看看什么是可以接受的。
但是,由于 ToUint32 抽象操作,根据 ECMA-262 第 5 版规范,数组的最大长度受无符号 32 位整数的约束,因此最长可能的数组可能有 2^32-1 = 4,294,967,295 = 42.9 亿个元素。
【讨论】:
以上是关于javascript中的大型数组是不是有项目限制的主要内容,如果未能解决你的问题,请参考以下文章
查找项目是不是在 JavaScript 数组中的最佳方法? [复制]
JavaScript Max Blob 大小是不是有任何限制
如何在 JavaScript 中解析大型 JSON 流中的项目?