Javascript中数组的最大大小

add*_*ely 100 javascript arrays

上下文:我正在构建一个读取RSS提要的小站点,并在后台更新/检查提要.我有一个数组来存储要显示的数据,另一个存储已经显示的记录的ID.

问题:在事情开始变慢或缓慢之前,Javascript中的数组可以容纳多少项.我不是在对数组进行排序,而是使用jQuery的inArray函数进行比较.

该网站将保持运行,并且更新并且不太可能经常重新启动/刷新浏览器.

如果我应该考虑从数组中清除一些记录,那么在限制之后删除一些记录的最佳方法是什么,比如100项.

mae*_*ics 138

直到"它变得缓慢"的最大长度完全取决于您的目标机器和您的实际代码,因此您需要在那些(那些)平台上进行测试以查看可接受的内容.

但是,由于ToUint32抽象操作,根据ECMA-262第5版规范的数组的最大长度受无符号32位整数的约束,因此最长的数组可能有2 32 -1 = 4,294,967,295 = 42.9亿个元素.

  • @ Barkermn01:ECMA-262第5版规范使用抽象操作*ToUint32*来检查修改其长度的任何操作的数组长度,因此我认为机器(或Web浏览器)的底层架构是无关紧要的. (13认同)
  • @ Barkermn01,64bit浏览器还有很多其他的改进.请记住,作为一个JavaScript解释器不是浏览器唯一做的事情. (3认同)
  • Wowzer 没想到它会这么高。好吧,很好,我想我会没事的! (2认同)

Lel*_*ran 26

无需修剪数组,只需将其作为循环缓冲区(index%maxlen)进行处理.这将确保它永远不会超过限制(实现一个循环缓冲区意味着一旦你到达终点,你再次回到开头 - 不可能超出数组的末尾).

例如:

var container = new Array ();
var maxlen = 100;
var index = 0;

// 'store' 1538 items (only the last 'maxlen' items are kept)
for (var i=0; i<1538; i++) {
   container [index++ % maxlen] = "storing" + i;
}

// get element at index 11 (you want the 11th item in the array)
eleventh = container [(index + 11) % maxlen];

// get element at index 11 (you want the 11th item in the array)
thirtyfifth = container [(index + 35) % maxlen];

// print out all 100 elements that we have left in the array, note
// that it doesn't matter if we address past 100 - circular buffer
// so we'll simply get back to the beginning if we do that.
for (i=0; i<200; i++) {
   document.write (container[(index + i) % maxlen] + "<br>\n");
}
Run Code Online (Sandbox Code Playgroud)

  • 这个想法是实现一个环形缓冲区,所以是 - 你故意"忘记"旧数据(这就是环形缓冲区的用途),这就是提问者所要求的. (9认同)
  • 聪明的想法,但通过这样做,你可能会覆盖数据,混淆索引,并可能导致奇怪的行为. (4认同)

Car*_*lsh 8

就像@maerics 所说的,您的目标机器和浏览器将决定性能。

但是对于一些真实世界的数字,在我 2017 年的企业 Chromebook 上,运行以下操作:

console.time();
Array(x).fill(0).filter(x => x < 6).length
console.timeEnd();
Run Code Online (Sandbox Code Playgroud)
  • x=5e4 需要 16ms,足够 60fps
  • x=4e6 需要 250 毫秒,这很明显,但没什么大不了的
  • x=3e7 需要 1300 毫秒,这很糟糕
  • x=4e7 需要 11000ms 并分配额外的 2.5GB 内存

所以大约 3000 万个元素是一个硬上限,因为 javascript VM 在 4000 万个元素时掉下悬崖并且可能会导致进程崩溃。


编辑:在上面的代码中,我实际上是用元素填充数组并循环遍历它们,模拟应用程序可能想要对数组执行的最少操作。如果您只是运行,Array(2**32-1) 您将创建一个稀疏数组,该数组更接近于一个空 JavaScript 对象,其长度为{length: 4294967295}. 如果您真的尝试使用所有这 40 亿个元素,您肯定会导致 javascript 进程崩溃。


oro*_*olo 5

您可以尝试执行以下操作来测试和调整长度:

http://jsfiddle.net/orolo/wJDXL/

var longArray = [1, 2, 3, 4, 5, 6, 7, 8];

if (longArray.length >= 6) {
    longArray.length = 3; 
}

    alert(longArray); //1, 2, 3
Run Code Online (Sandbox Code Playgroud)

  • 最终由于需要使用slice而需要从数组开始处进行修剪。 (2认同)