我正在将一个大数组嵌入到我的HTML的<script>
标签中,像这样(没有什么意外):
<script>
var largeArray = [/* lots of stuff in here */];
</script>
在这个特定的例子中,该数组有210,000个元素。这远低于理论最大值2的31次方,少了4个数量级。有趣的是:如果我将数组的JS源代码保存到文件中,那么该文件的大小将超过44兆字节(确切地说是46,573,399字节)。
如果您想亲自查看,可以从GitHub上下载它。(其中所有数据都是固定的,因此其中许多数据是重复的。这在生产环境中不会发生。)
现在,我真的不担心服务这么多数据。我的服务器对其响应进行gzip压缩,因此获取数据并不需要太长时间。但是,页面一旦加载后,就会导致浏览器崩溃。我没有在IE中进行测试(这是一个内部工具)。我的主要目标是Chrome 8和Firefox 3.6。
在Firefox中,我可以在控制台中看到一个相当有用的错误:
在Chrome中,我只会得到一个悲伤的标签页。
错误:脚本堆栈空间配额已耗尽
言归正传
- 我们现代的“高性能”浏览器真的无法处理这么多数据吗?
- 我有什么办法可以优雅地处理这么多数据吗?*
顺便说一句,我在 Chrome 上时而成功(也就是没有崩溃标签页),时而失败。我真的以为 Chrome 至少还算坚强,但显然我错了...
编辑1
@Crayon:我不是在解释为什么我想一次性将这么多数据转储到浏览器中。简而言之:要么我解决这个问题(承认这并不容易),要么我必须解决一系列其他问题。目前我选择更简单的方法。
@各位:目前,我并不特别寻求实际减少数组中元素数量的方法。我知道我可以实现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内存和超过0.5 TB磁盘空间的电脑......我甚至不要求浏览器快速运行,我只是希望它能正常工作 起码!☹
编辑2
任务完成!
在Juan和Guffa的准确建议下,我成功地让它工作了!问题似乎只是在解析源代码上,而不是实际在内存中处理它。
总结一下对Juan答案的评论混乱:我必须将我的大数组分成一系列较小的数组,然后Array#concat()
它们,但这还不够。我还必须将它们放入单独的var
语句中。像这样:
var arr0 = [...];
var arr1 = [...];
var arr2 = [...];
/* ... */
var bigArray = arr0.concat(arr1, arr2, ...);
对于所有贡献解决方案的人:谢谢你们。第一轮由我请客!
*除了显而易见的:向浏览器发送更少的数据
var all = [ [...前100个...], [...后100个...], ... ];
看看是否可以加载。如果这样做可以成功,再尝试使用concat()
方法将它们合并。如果这种方法行不通......不要抱怨浏览器应该如何处理这个问题,而是1.向浏览器报告错误2.改变你的方法。 - Phrogz