我在 HTML 中的 <script>
标记中嵌入了一个大型数组,如下所示(这并不奇怪) :
<script>
var largeArray = [/* lots of stuff in here */];
</script>
在这个例子中,数组有210,000个元素。这远低于理论上的最大值231-by 数量级。这里是有趣的部分: 如果我将数组的 JS 源代码保存到一个文件中,该文件大于44兆字节(确切地说是46,573,399字节)。
如果你想亲眼看看,你可以 从 GitHub 下载。(里面的所有数据都是罐装的,所以很多数据都是重复的。在生产过程中不会出现这种情况。)
现在,我真的不担心 服务有那么多的数据。我的服务器 gzip 它的响应,所以它真的不需要所有那么长的时间来获得通过线路的数据。然而,有一个真正令人讨厌的趋势,页面,一旦加载,以 撞车的浏览器。我根本没有在 IE 中测试(这是一个内部工具)。我的主要目标是 Chrome 8和 Firefox 3.6。
在 Firefox 中,我可以在控制台中看到一个相当有用的错误:
Error: script stack space quota is exhausted
在 Chrome 浏览器中,我只是看到了悲伤标签页:
顺便说一下,我能够让这个工作(读: 不崩溃的标签)在 Chrome 中断断续续。我真的以为 Chrome 至少是由更坚固的东西组成的,但显然我错了... ..。
@ Crayon: 我不是想证明 为什么的合理性,我想把这么多的数据一次性扔进浏览器。简而言之: 要么我解决这个问题(当然不是那么容易) ,要么我必须解决一大堆其他问题。我现在选择更简单的方法。
@ different: 现在,我并没有特别寻找减少数组中元素数量的方法。我知道我可以实现 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核处理器的电脑,6GB 的内存,超过半 TB 的磁盘空间... ... 我甚至不要求浏览器快速完成这些——我只是要求它能工作 完全没有! something
任务完成!
有了来自 胡安以及 Guffa的正确建议,我能够让这个工作!看起来问题只存在于 解析的源代码中,实际上并没有在内存中使用它。
总结一下胡安的回答: 我不得不把我的大数组分成一系列的小数组,然后 Array#concat()
它们,但这还不够。我 还有必须把它们放在单独的 var
语句中。像这样:
var arr0 = [...];
var arr1 = [...];
var arr2 = [...];
/* ... */
var bigArray = arr0.concat(arr1, arr2, ...);
对每一个为解决这个问题做出贡献的人: 谢谢你。第一轮我请!
* 除了显而易见的: 向浏览器发送更少的数据