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

2023-11-25

我正在嵌入一个大数组<script>我的 HTML 中的标签,如下所示(没什么奇怪的):

<script>
    var largeArray = [/* lots of stuff in here */];
</script>

In this particular example, the array has 210,000 elements. That's well below the theoretical maximum of 231 - by 4 orders of magnitude. Here's the fun part: if I save JS source for the array to a file, that file is >44 megabytes (46,573,399 bytes, to be exact).

如果你想亲自看看,你可以从 GitHub 下载。 (里面的所有数据都是固定的,所以很多都是重复的。在生产中不会出现这种情况。)

现在,我真的不关心serving那么多数据。我的服务器对其响应进行 gzip 压缩,因此实际上不需要那么长时间即可通过网络获取数据。然而,页面一旦加载,就会有一种非常令人讨厌的倾向:crash浏览器。我根本不在 IE 中进行测试(这是一个内部工具)。我的主要目标是 Chrome 8 和 Firefox 3.6。

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

Error: script stack space quota is exhausted

在 Chrome 中,我只需获取悲伤标签页面:

enter image description here

切入正题,已经

  • Is this really我们现代的“高性能”浏览器无法处理太多数据?
  • 我能做些什么*来优雅地处理这么多数据吗?

顺便说一句,我能够在 Chrome 中打开和关闭它(阅读:不会使选项卡崩溃)。我真的认为 Chrome 至少是由更坚硬的东西制成的,但显然我错了......


Edit 1

@Crayon:我并不是想证明自己的合理性why我想立即将这么多数据转储到浏览器中。简短版本:要么我解决这个(诚然不是那么容易)问题,要么我必须解决一大堆其他问题。我现在选择更简单的方法。

@various:现在,我并不是特别寻找实际减少数组中元素数量的方法。我知道我可以实现 Ajax 分页或其他什么,但这在其他方面给我带来了一系列问题。

@Phrogz:每个元素看起来像这样:

{dateTime:new Date(1296176400000),
 terminalId:'terminal999',
 'General___BuildVersion':'10.05a_V110119_Beta',
 'SSM___ExtId':26680,
 'MD_CDMA_NETLOADER_NO_BCAST___Valid':'false',
 'MD_CDMA_NETLOADER_NO_BCAST___PngAttempt':0}

@Will:但我有一台配备 4 核处理器、6 GB RAM、超过半 TB 磁盘空间的计算机......而且我什至不要求浏览器快速执行此操作 - 我只是要求让它发挥作用at all!


Edit 2

任务完成!

有了来自的现场建议JuanGuffa,我能够让它发挥作用!看来问题就出在parsing源代码,实际上并没有在内存中使用它。

总结一下胡安回答中的评论泥潭:我不得不将我的大数组分成一系列较小的数组,然后Array#concat()他们,但这还不够。我also不得不把它们分开var声明。像这样:

var arr0 = [...];
var arr1 = [...];
var arr2 = [...];
/* ... */
var bigArray = arr0.concat(arr1, arr2, ...);

对于所有为解决此问题做出贡献的人:谢谢。第一轮由我来!


*other than the obvious: sending less data to the browser


这就是我要尝试的:你说这是一个 44MB 的文件。这肯定需要超过 44MB 的内存,我猜这需要超过 44MB 的 RAM,也许是半个 gig。您能否减少数据直到浏览器不崩溃并查看浏览器使用了多少内存?

即使仅在服务器上运行的应用程序也不会读取 44MB 文件并将其保留在内存中。话虽如此,我相信浏览器应该能够处理它,所以让我运行一些测试。

(使用Windows 7,4GB内存)

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

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

第三次测试由于 Firefox 说它耗尽了堆栈,问题可能是它无法立即解析数组。我创建了两个单独的数组 arr1, arr2 然后执行 arr3 = arr1.concat(arr2);它运行良好,仅使用略多的内存,大约 165MB。

第四次测试我正在创建 7 个这样的数组(每个 22MB)并将它们连接起来以测试浏览器限制。页面加载完成大约需要 10 秒。内存上升至 1.3GB,然后下降至 500MB。所以 chrome 可以处理它。它只是无法一次解析全部内容,因为它使用某种递归,正如控制台的错误消息所示。

Answer创建单独的数组(每个数组小于 20MB),然后将它们连接起来。每个数组应该位于其自己的 var 语句中,而不是使用单个 var 进行多个声明。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Mozilla WebExtension API 存储 - 使用和不使用断点进行调试会导致不同的输出

    大家好 我正在尝试为 Mozilla Firefox 浏览器实现一个附加组件 以下脚本显示了我已经成功集成的一个后台脚本 它使用 Mozilla WebExtension API 存储 它被执行了 但浏览器控制台上的日志让我感到惊讶 我交替
  • 绑定 popstate 事件不起作用

    我尝试在浏览器的控制台中输入以下代码 window onpopstate function alert 1 然后单击后退按钮 没有显示任何警报 难道我做错了什么 或者是否不允许将 popstate 事件绑定到控制台的页面 使用 Chrome
  • 如何动态删除嵌套的json键?

    这是示例 json search facets author language value nep count 3 value urd count 1 source value West Bengal State Council of Vo
  • 玉石压痕错误

    因此 对于我的 Express 网站 我使用 jade 所以我决定尝试修改我的布局文件 以便我可以开始设计我的网站 我修改了原始布局代码 有效 但我开始在任何扩展布局的文件中出现缩进错误 如下所示 500 Error home kevin
  • React Native 无法访问 Cloud Firestore 后端

    我之前使用的是 firebase 实时数据库 但现在想切换到 Cloud Firestore 但即使经过身份验证 也会收到以下错误 我目前正在使用 Android Simulator 尝试禁用我的实时数据库 但找不到解决方案 Firebas
  • 使用 babel env 预设时,展开运算符出现语法错误

    我正在努力 现代化 meern io 入门样板 https github com Hashnode mern starter通过替换巴别塔es2015 and stage 0预设为env 然而 似乎env预设无法识别以下片段client m
  • 指定 HTML5 输入类型 = 日期的值输出?

    我想将本机日期选择器添加到我的应用程序中 该应用程序当前使用遗留的本地系统 日期输入支持尚未广泛普及 但如果我可以基于兼容性提供这两种实现 那就太理想了 有没有办法指定 HTML 日期选择器给出的值的输出 歌剧的默认设置是yyyy mm d
  • 替换img路径jquery

    我正在尝试替换 jquery 中的 img 路径 注入远程页面 replaceexample com thumbs withexample com images 我已经尝试过这个 但似乎不起作用 img attr src replace t
  • 为某个时刻添加持续时间 (moment.js)

    时刻版本 2 0 0 阅读文档后 http momentjs com docs manipulating add 我认为这很简单 Chrome 控制台 var timestring1 2013 05 09T00 00 00Z var tim
  • 如何使用 github 托管外部 CSS 文件?

    我将 css 上传到 github 然后转到网站上的文件并单击 raw 选项 我尝试将其添加到网页中 但 chrome 给出以下错误 资源解释为样式表 但使用 MIME 类型 text plain 进行传输 https raw github
  • 如何将文件中的行读入数组?

    我正在尝试将文件作为行数组读入 然后使用 zsh 对其进行迭代 我得到的代码在大多数情况下都有效 除非输入文件包含某些字符 例如括号 这是它的一个片段 bin zsh LIST cat path to some file txt SIZE
  • 为什么这个递归函数返回未定义?

    我正在尝试编写一个使用递归组合两个字符串的函数 我的代码如下 但我不知道为什么该函数返回未定义 特别是当我在基本情况下使用 console log 时 它不会打印未定义而是打印正确的值 var str3 function merge str
  • 使用 eval 时不会受到 XSS 威胁

    我正在制作 不是现在 但我仍然对这个感到好奇 一款使用 HTML5 和 JS 的游戏 我想要的是人们可以插入自定义脚本 但要安全 function executeCustomJS code eval code bad 当然这段代码非常糟糕
  • iPhone 上的锁定方向 UIWebView

    有没有办法锁定 UIWebView 的方向 使用 Obj C JS 还是 Html 我不想有按钮或任何东西 我只想在应用程序打开时将其锁定为纵向 好像这个堆栈溢出帖子 https stackoverflow com questions 43
  • 为什么 console.log() polyfill 不使用 Function.apply()?

    我一直在看一些流行的console log 包装 填充 保罗 爱尔兰的 http paulirish com 2009 log a lightweight wrapper for consolelog 本阿尔曼的 http benalman
  • WebpackError:ReferenceError:Gatsby 上未定义窗口

    我已经在互联网上进行了大量搜索 但无法解决这个问题 我正在使用 Gasby 开发静态页面 但遇到此错误 WebpackError ReferenceError window is not defined 我的线索是 这与我正在使用的引导 模
  • 如何计算一行中Flexbox项目的数量?

    网格是使用 CSS flexbox 实现的 Example http jsbin com jumosicasi edit html css js output 本示例中的行数为 4 因为我出于演示目的固定了容器宽度 但是 实际上 它可以根据
  • 有序 JSON 对象

    我有一个 servlet 它与数据库通信 然后返回有序 按时间排序 对象的列表 在servlet部分 我有 access DB returns a list of User objects ordered ArrayList users M
  • 使用严格模式编译指示时如何声明全局变量

    使用自调用函数来包装严格模式兼容代码 通常称为严格模式编译指示 被认为是一种很好的做法 function use strict Strict code here 我的问题是在这种情况下如何声明全局变量 我今天知道的三种替代方案 替代方案 1
  • 突出显示单词并提取其附近文本的函数

    我有一个文本例如 Etiam porta semmalesuada magna mollis euismod 整数取数 ante venenatis dapibus posuere velit aliquet 埃蒂亚姆 门塔 塞姆 male

随机推荐

  • ReferenceError:未定义 privateSpecialRepair

    我在哨兵上收到此错误 我不知道下一个 路由器如何或为什么将用户重定向到同一页面 它发生在某些浏览器上 并且在某些浏览器上工作得很好 Tags routing instrumentation next router 操作 页面加载 看起来这与
  • Xcode 4 外部构建项目和调试

    我已经设置了一个基于 makefile 的项目 可以在多个平台上构建我的代码 在我的 Mac 上 我想使用 Xcode 进行调试 我已将 Xcode 设置为外部构建项目 我可以从 Xcode 中运行该应用程序 输出显示在 Xcode 中 如
  • 我应该如何组织我的 OCaml 项目?

    我知道这个问题很普遍 我什至不知道如何更好地问 我没有太多的经验C我只是希望我能在 OCaml 中做与 Java 类似的事情 例如 在Java 我通常创建一个项目 使用Eclipse或其他 IDE 那么我有一个src文件夹和一个bin文件夹
  • JTable 列跨越

    我正在尝试做一个JTable有可用的列跨度 具体来说 我希望嵌套一个JTable在另一个里面JTable 当用户单击查看嵌套表时 它应该展开以下推下面的行并填充空白空间 这与您在 MS Access 中看到的类似 您可以在其中嵌套表 单击行
  • JavaScript 中的全局变量和“window.variable”有什么区别?

    我正在读骨干网 js文档 并且我看到很多将属性分配给window object window something whatever 调用此代码与仅分配变量并创建全局变量有什么区别 如下所示 something whatever 我假设存在某
  • 将多级 JSON 菜单转换为多级 JSX/HTML 菜单

    我在用智能菜单创建一个下拉菜单 但是 我想动态创建菜单 React 应用程序将向 API 服务器查询 JSON 代码 并据此构建菜单 我正在尝试找出一种将 JSON 代码转换为 HTML JSX 代码的方法 从 API 检索到的 JSON
  • OpenCV 输入数组/输出数组

    我刚刚编译了 OpenCV 2 3 的最新版本 他们决定将所有 Matrix 输入 输出更改为 InputArray OutputArray 这让一切都变得混乱 在 OpenCV 2 2 下运行良好的同一段代码现在毫无价值 我可以接受两种解
  • 创建maven项目

    如何在 Eclipse 中创建一个简单的 Maven 项目 每次创建项目时都会出现错误 错误 描述 资源路径 位置类型 CoreException Could 不计算构建计划 插件 org apache maven plugins mave
  • CSRF 令牌与 Laravel sainttum 和 Angular http 不匹配

    我一直在尝试实现 Laravel Sanctum 但即使我遵循了 Laravel Sanctum 文档中所述的所有内容 我也遇到了 CSRF 令牌不匹配 错误 cors php配置文件 paths gt api login logout s
  • 显示不同时区的时间

    有没有一种优雅的方式来显示另一个时区的当前时间 我想要一些具有以下一般精神的东西 cur
  • 如何扩展 Array 类并保留其实现

    我想向 Array 类添加一些函数 我不想将它们作为类外部的函数 因为理想情况下在键入时可以发现它们 跟随物体 这是我到目前为止所拥有的 export class List
  • RDLC - 在VS2010中添加数据源

    问候 我有一个 RDLC 文件 并且想向其中添加数据源 尽管到目前为止还没有任何运气 数据源是我自己编写的自定义类 只是补充一下 我们一直这样做 我们最近转换为 VS2010 RDLC 格式 这导致了一些问题 但我们对实现进行了一些更改 解
  • 从任务栏隐藏外部应用程序

    我浏览了许多不同的论坛 但找不到方法 我希望从任务栏隐藏外部应用程序图标 但不最小化应用程序 我不知道从哪里开始 也不知道如何去做 任何帮助将不胜感激 NOTE隐藏外部应用程序图标 而不是我的表单的图标 您可以使用橱窗展示功能 这是一个小示
  • 如何调整图像大小以适合浏览器窗口?

    这看起来微不足道 但经过所有研究和编码后 我无法让它发挥作用 条件是 浏览器窗口大小未知 因此 请不要提出涉及绝对像素大小的解决方案 图像的原始尺寸未知 并且可能适合也可能不适合浏览器窗口 图像垂直和水平居中 必须保留图像比例 图像必须完整
  • 允许 NULL arg 进行 sscanf?

    Is a NULL允许将指针作为字符串来存储调用中的结果sscanf 我在任何文档中都没有找到有关它的任何内容 但它似乎工作正常 同样的事情与scanf Example int main int arc char argv char s N
  • 如何在 HandshakeInterceptor 中设置主体

    我正在使用 Spring 的 WebSockets 的一个非常精简的实现 WebSocketSession 有 getPrincipal 方法 但如何在 HandshakeInterceptor 中设置它 我想将校长放入的方法是 publi
  • 在 AngularJS 中使用 $window 或 $location 进行重定向

    我正在开发的应用程序包含各种状态 使用 ui router 其中一些状态要求您登录 其他状态是公开可用的 我创建了一种有效检查用户是否登录的方法 我目前遇到的问题实际上是在必要时重定向到我们的登录页面 应该注意的是 登录页面当前并未放置在
  • Celery - 检查工作人员是否收到 SIGTERM

    我有一个Celery任务相当长 超过几分钟 有时 由于各种原因 一个工作人员被标记为终止 而另一个工作人员则开始工作 如果需要更换运行它的计算机 或者正在部署新的代码版本 则可能会发生这种情况 在这种情况下 工作线程会收到 SIGTERM
  • 设置列的最大值

    我有一个表 其中有一列 int 类型 称为年龄 此列应包含最大值 50 如果超过 则不应更新该行 表示此列应采用 0 到 50 之间的值 如果我尝试将其更新为 51 则不允许 任何人都可以帮忙吗 尝试这个 CREATE TRIGGER ch
  • 我是否已达到浏览器中 JavaScript 可以处理的对象大小的限制?

    我正在嵌入一个大数组