Javascript中数组的最大大小

时间:2011-05-27 16:14:09

标签: javascript arrays

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

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

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

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

7 个答案:

答案 0 :(得分:132)

“它变得迟钝”之前的最大长度完全取决于你的目标机器和你的实际代码,因此你需要在那些(那些)平台上进行测试,看看哪些是可以接受的。

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

答案 1 :(得分: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");
}

答案 2 :(得分:4)

您可以尝试这样的测试和修剪长度:

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

答案 3 :(得分:2)

我已经构建了一个操作和绘制数百万个数据集的性能框架,即使这样,javascript计算延迟也只有几十毫秒。除非你担心超过数组大小限制,否则我认为你不用担心。

答案 4 :(得分:1)

就像@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花费1300毫秒,这很糟糕
  • x=4e7耗时11000毫秒,并分配了额外的2.5GB内存

因此,大约3000万个元素是一个硬上限,因为javascript VM掉落到4000万个元素的悬崖上,很可能会导致进程崩溃。

答案 5 :(得分:0)

它将取决于浏览器。 100项听起来不是很多 - 我希望你能比这更高。成千上万不应成为问题。可能存在的问题是总内存消耗。

答案 6 :(得分:0)

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