Javascript中数组的最大大小
上下文:我正在构build一个读取rss订阅源的小站点,并在后台更新/检查订阅源。 我有一个数组来存储要显示的数据,另一个数组存储已经显示的logging的ID。
问题:在事情开始变慢或缓慢之前,一个数组可以拥有多less个项目。 我没有对数组进行sorting,但是使用jQuery的inArray函数进行比较。
该网站将保持运行,更新和不太可能的浏览器将经常重新启动/刷新。
如果我应该考虑从数组中清除一些logging,那么在限制之后删除一些logging(如100个项目)的最佳方法是什么?
直到“变慢”的最大长度完全取决于你的目标机器和你的实际代码,所以你需要在那个(那些)平台上进行testing,看看什么是可以接受的。
然而,由于ToUint32抽象操作,根据ECMA-262第5版规范的数组的最大长度受无符号的32位整数约束 ,所以最长可能的数组可能具有2 32 -1 = 4,294,967,295 = 42.9亿个元素。
不需要修整数组,只需将其作为循环缓冲区(索引%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"); }
你可以尝试这样的testing和修剪长度:
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
我已经构build了一个性能框架来操作和绘制数百万个数据集,即使如此,JavaScript计算延迟也只有几十毫秒。 除非你担心超出arrays大小限制,否则我不认为你有太多担心。
这将是非常依赖浏览器。 100个项目听起来不像一个大数字 – 我希望你可以走得比这更高。 数以千计不应该是一个问题。 可能是一个问题是总内存消耗。
我无耻地在内存中拉出了一些非常大的数据集,尽pipe它确实得到了缓慢,但是可能需要15Mo的数据,而对数据集进行了相当强烈的计算。 我怀疑你会遇到与内存有关的问题,除非你对数据和许多行进行了深入的计算。 使用不同的模拟结果集进行分析和基准testing将是评估性能的最佳select。