开发者社区> 问答> 正文

我是否已达到浏览器中JavaScript可以处理的对象大小的限制?

我 在此特定示例中,数组具有210,000个元素。这远远低于2的理论最大值31 -由4个数量级。这是有趣的部分:如果我将数组的JS源代码保存到文件中,则该文件> 44兆字节(准确地说是46573399字节)。

如果您想亲自看看,可以从GitHub下载。(其中的所有数据都是固定的,因此要重复很多。在生产环境中不是这种情况。)

现在,我真的不担心要提供那么多数据。我的服务器通过gzip压缩其响应,因此实际上并不需要花很长时间就能通过网络获取数据。但是,页面一旦加载,就会使浏览器崩溃,这确实是一种令人讨厌的趋势。我根本没有在IE中测试(这是一个内部工具)。我的主要目标是Chrome 8和Firefox 3.6。

在Firefox中,我可以在控制台中看到一个相当有用的错误:

Error: script stack space quota is exhausted

在Chrome中,我只是获得了悲伤标签页:

在此处输入图片说明

切入正题 对于我们现代的“高性能”浏览器来说,这真的是太多数据了吗? 我可以做些什么来优雅地处理大量数据? 顺便说一句,我能够在Chrome中断断续续地使用它(阅读:不会使选项卡崩溃)。我真的以为Chrome至少是由更坚固的材料制成的,但是显然我错了... 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-09 13:12:49 530 0
1 条回答
写回答
取消 提交回答
  • 这是我尝试的方法:您说的是44MB文件。这肯定会占用超过44MB的内存,我想这会占用超过44MB的RAM,也许是半个演出。您是否可以减少数据直到浏览器不崩溃并查看浏览器使用了多少内存?

    即使只在服务器上运行的应用程序也可以很好地服务于不读取44MB文件并将其保存在内存中的情况。说了这么多,我相信浏览器应该能够处理它,所以让我运行一些测试。

    (使用Windows 7、4GB内存)

    第一次测试, 我将阵列切成两半,没有问题,使用了80MB,没有崩溃

    第二次测试 我将阵列拆分为两个单独的阵列,但是仍然包含所有数据,使用160Mb,没有崩溃

    第三次测试 由于Firefox表示已用完堆栈,因此问题可能出在它无法立即解析数组。我创建了两个单独的数组arr1,arr2,然后做了arr3 = arr1.concat(arr2); 它运行良好,仅使用了大约165MB以上的内存。

    第四项测试我正在创建其中的7个数组(每个数组22MB),并将其设置为测试浏览器限制。页面完成加载大约需要10秒钟。内存增加到1.3GB,然后又减少到500MB。所以是的,Chrome可以处理它。它只是无法一次解析所有内容,因为它使用某种递归,如控制台的错误消息所注意到的那样。

    回答创建单独的阵列(每个阵列小于20MB),然后合并它们。每个数组应在其自己的var语句上,而不是使用单个var进行多个声明。

    我仍然会考虑仅提取必要的部分,这可能会使浏览器变慢。但是,如果这是内部任务,那应该没问题。

    最后一点:您没有最大的内存级别,只是最大的解析级别。

    2020-02-09 13:13:05
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
JavaScript函数 立即下载
JavaScript异步编程 立即下载
基于浏览器的实时构建探索之路--玄寂 立即下载