JavaScript中数组的最大大小


108

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

问题:在事情变慢或变慢之前,数组可以在Javascript中容纳多少个项目。我没有对数组进行排序,但是正在使用jQuery的inArray函数进行比较。

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

如果我想考虑从数组中清除一些记录,那么在限制(例如100个项目)后删除某些记录的最佳方法是什么。


3
与JS代码相比,浏览器从工具栏泄漏内存的问题可能更多。:) Firefox 4我的手指指向你。
epascarello

1
您多久检查一次阵列(例如2s间隔)?什么构成迟滞(例如> 500ms)?您的阵列是什么数量级(例如数千,数百万,数十亿)?
zzzzBov 2011年


我将每分钟检查和更新阵列。是的,迟钝会是性能问题,开始影响加载和检查以及页面上的其他动画,很难定义对不起!
2011年

@Amine感谢您的链接,看起来该网站将成为我的新最好朋友:)
2011年

Answers:


153

直到“速度变慢”为止的最大长度完全取决于目标计算机和实际代码,因此,您需要在该平台上进行测试,以了解可接受的平台。

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


13
@ Barkermn01:ECMA-262第5版规范使用抽象操作ToUint32来检查任何修改了数组长度的操作上的数组长度,因此我认为计算机(或Web浏览器)的基础体系结构无关紧要。
maerics 2011年

1
人力资源管理很好,只是读到一个可怕的64位浏览器是毫无意义的,然后,
Barkermn01 2011年

3
@ Barkermn01,64位浏览器还有很多其他改进。请记住,作为JavaScript解释器并不是浏览器唯一要做的事情。
剃刀风暴

1
Wowzer不会期望它这么高。好吧,我想我会没事的!
2011年

实际上,一个数组最多可以包含4294967295(2 ^ 31-1)个元素。请参阅stackoverflow.com/a/12766547/396458
NullUserException

26

无需修剪数组,只需将其作为循环缓冲区(索引%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");
}

4
聪明的主意,但是这样做可能会覆盖数据,使索引混乱,并可能导致奇怪的行为。
约翰·克特吉克

9
这个想法是实现一个环形缓冲区,所以是的-您有意“忘记”旧数据(这就是环形缓冲区的用途),也是发问者所要求的。
Lelanthran 2014年

1
我只是无聊地单击SO,然后找到了此响应。喜欢这项技术,可以根据需要覆盖索引。
凯尔·霍奇基斯

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


2
最终由于需要使用slice而需要从数组开始处进行修剪。
2011年

3

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

但是对于某些实际数字,请在我的2017年企业版Chromebook上运行以下操作:

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

因此,大约3,000万个元素是一个硬上限,因为javascript VM落在4,000万个元素的悬崖上,很可能会使进程崩溃。


2

我建立了一个性能框架,可以处理和绘制数以百万计的数据集,即使如此,JavaScript计算的延迟也只有几十毫秒。除非您担心超出数组大小限制,否则我认为您不必担心太多。


0

这将取决于浏览器。100件物品听起来不算太多-我希望您能比这高得多。成千上万应该不是问题。可能的问题是总内存消耗。


0

我无耻地拉出了内存中的一些非常大的数据集,尽管它确实变慢了,但在数据集上进行了非常密集的计算后,它可能需要花费15 Mo的向上数据。我怀疑除非对数据和许多行进行大量计算,否则您将遇到内存问题。使用不同的模拟结果集进行性能分析和基准测试是评估性能的最佳选择。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.