实际上数组大小的限制

4
注意:我对其他人使用的“大型”数组大小非常感兴趣。这不是我第一次想到这个问题,我欢迎反馈。
下面我详细介绍的方案需要朝着这个目标开发,因此最好在开始之前知道是否应该花费带宽并放弃这个想法,或者这是否是一种对带宽进行微小增益的实用方法。在其他情况下,对于其他可能感兴趣的人或我的未来项目,收益可能更大。
通常,当我遇到大型javascript数据集是一个选项的情况时,通常还有其他选项,并且我倾向于其他选项。我真的不确定什么样的大小才算大或太大。
我想知道在生产环境中安全使用的大小。我知道理论极限,但我找不到任何关于实际极限的信息。如我下面所述,我的数组有14000个元素和356k的大小。
当然,我知道javascript是客户端的,并且取决于客户机的规格、我的代码以及在某种程度上浏览器的版本(在相关的内部性能在版本之间改进的情况下)。
像任何值得尊敬的现代网站一样,它也将有一个移动版本,这实际上是内存问题所在。
我实际上并不认为这个大小对于客户机合理的规格期望来说太大或接近它,但我可能是错的,这是我长期以来一直想知道的问题,并且没有找到任何好的信息。(当然,这个问题的答案与N年前完全不同)。
编辑:我知道数组大小的32位限制,但我正在询问在健康的生产环境中可以工作并表现良好的内容。

背景:

我正在计划一款圣经搜索引擎。
我有一份带有引文的《英王詹姆斯版圣经》副本。其中一些引文非常长,因为我将在网络上提供此服务,所以我决定将引文重写为引文的索引数组。这样我就可以将引文重写为更短的代码以及更少的文本并消耗更少的带宽。
这使我得到了一个有14000个元素和356k大小(216k数据)的数组,所有经文的整体大小缩小了20%(2mb,平均每节65字节)。我会称之为一种收益。
文件预览如下:
['s=h07225','s=h0430','s=h0853','m=sm:th8804']

然而,使用这个数组来持续搜索结果的潜在缺点是消耗的内存。

1
就JS而言,数组无法容纳超过“2 ^ 32-2”个值,因为数组索引是32位数字。 - Felix Kling
3
需要一次性将所有引用加载到客户端吗? - html_programmer
@cfqueryparam 我不确定是否理解正确。一张页面上肯定不需要十亿个工具提示吧?而 [c=1] 是什么意思? - html_programmer
@KimGysen [c=1]...[/c] 是类似于BBML的短代码。我可以使用JavaScript和正则表达式将其重写为类似于 <A href="....s=h0430">...</a> 的东西。你提出了一个很好的观点,即不需要整个数组来获取结果集,但另一种选择是为每个新搜索重新生成它,这会增加服务器端时间并降低缓存JavaScript的价值。 - Regular Jo
1
请注意使用@cfqueryparam:var url = "http://example.com?"+"[a=3]".replace(/\[|\]/gi, ""); "link to scripture".link(URL); - Todd
显示剩余9条评论
1个回答

1
我的建议是使用localStorage,这样可以通过AJAX将数据缓存在客户端上,不会影响页面的初始加载。一旦在客户端上进行了缓存,您就可以自由地使用它。此外,您可能需要添加一种方法来不断检查数组。您可以检查是否存在,并在不存在时再次进行AJAX请求。本地存储可以随时被浏览器删除。
另一个选择是放置一个JavaScript Web资源,该资源会被缓存在浏览器中。您可以使用<script>标签引入它。该文件将在应用程序中声明全局数组。有一个async属性可用于异步加载。缺点是需要找出何时可用您的数组。

我很感激关于本地存储的想法。至于第二个选项,我主要是好奇数组的大小是否会成为问题。 - Regular Jo
14,000 远远低于 2^32 的限制。现代网站(例如本网站)大约为 1.5MB。想法是异步加载数据并将其缓存。一旦缓存,您只需专注于其余内容。您的主要关注点应该是 HTTP 负载。所有这些都是为了说,您应该没问题。 - beautifulcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接