js如何存储一个大数组,避免浏览器堆栈溢出。

新手上路,请多包涵

问题描述

在使用ztree渲染一个树结构时,树数据采取的是simple模式,所以zNodes=[{},{},{},...]这样的一个树结构。这个数据量很大,有5w+条的数据,还没有对ztree初始化,用IE11打开就先弹窗报错“来自页面的消息:堆栈溢出,在第1行。”

问题出现的环境背景及自己尝试过哪些方法

实际项目情况是,使用浏览器直接打开页面,是正常的,但是用一个C++编写软件里面调用了浏览器,软件里面的浏览器打开页面就会报堆栈溢出,而且IE9不会,IE11会(其他版本还没有测过)。

补充说明:

  1. 不是递归调用引起,因为整个页面只保留这个大数组变量声明,就会产生这个问题
  2. 猜测是浏览器的堆栈内存容量问题。但疑惑,为什么直接使用系统IE打开容量够,但用软件调用IE打开就会堆栈溢出了?
  3. 虽然当前的大数组,只在软件IE打开才会。但还是想寻找一张解决方式,让js能存储大数组,因为再优异的浏览器,遇到足够大的数组变量,应该都会发生堆栈溢出。
  4. emmm,项目原因,是本地项目,并同时给与大数组变量,没有办法异步加载。所以不要说什么异步加载啦。

相关代码

代码就不贴了,就是声明一个5w+的对象数组,直接浏览器运行网页。(浏览器不同,堆栈内存容量也不同,所以可以加大数组数量,直到产生堆栈溢出报错)

你期待的结果是什么?实际看到的错误信息又是什么?

希望能提供个思路,看怎么存储一个大数组。不要在声明变量时候就堆栈溢出了。

阅读 7.9k
5 个回答

内存不够你就别硬要一下子塞那么多数据,渲染肯定也不可能5w条数据一下子全部渲染的,你的问题的根本在于怎么优化算法,怎么减少必须一次性载入内存的数据量,怎么做到渲染多少就载入多少而不是一下5w条。但是如果你其实只是想找个地方先放着这5w条,你可以先把5w条数据切成若干片(方便用的时候索引)放localStorage里。

接口不能分页么...

理论上不该在客户端添加这么多的数据,即使要添加,也应该是用某种规则,分部分加,而不是一次性加载,这是因为:

  1. 加载了其实是没有意义的,因为客户端不可能一次性展示那么多数据用于同人的交互
  2. 本身环境限制

相应的处理应该在另外的机制(处理过程中)

generator试试?

建议使用异步的加载,
我记得 Ztree 是支持异步加载的吧?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题