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 数组中的最佳方法? [复制]

JavaScript Max Blob 大小是不是有任何限制

如何在 JavaScript 中解析大型 JSON 流中的项目?

无法使用 javascript 中的 Promise 遍历问题数组中的每个项目

在 Jade/Express 中迭代数组是不是有限制?