Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
512 views
in Technique[技术] by (71.8m points)

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

问题描述

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

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

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

补充说明:

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

相关代码

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

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

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...