【发布时间】:2014-05-04 01:55:14
【问题描述】:
我正在编写一个用于可视化数据的浏览器应用程序。有非常大量的数据(数百万行,每行可能有几十个值),在大多数语言中可以以边际开销存储。 Javascript 似乎将数据存储在比所需空间多几倍的空间中,而不管浏览器如何,我已将其范围缩小到数组实现。下面是一个比较 1000 万个数字与 1000 万个数组的内存存储的示例:
默认用法:
火狐:90Mb
铬:30Mb
IE:10Mb
数字:
arr = new Array();
for (var i = 0; i < 10000000; i++) {
arr.push(1);
}
Firefox:170Mb - 90Mb = 80Mb = 每个值约 8 个字节
Chrome:140Mb - 30Mb = 110Mb = 每个值约 11 个字节
IE:90Mb - 10Mb = 80Mb = 每个值约 8 个字节
数组:
arr = new Array();
for (var i = 0; i < 10000000; i++) {
arr.push(new Array());
}
Firefox:970Mb - 90Mb = 880Mb = 每个空数组约 88 个字节
Chrome:550Mb - 30Mb = 520Mb = 每个空数组约 52 个字节
IE:930Mb - 10Mb = 920Mb = 每个空数组约 92 个字节
有没有人对这种大量内存使用有任何解释,更重要的是,有没有人有任何解决方案?有一些方法可以解决这个问题,但是为每一行使用一个数组会使数据更容易处理。希望有一个解决方案,因为存储 1000 万行数据需要千兆字节的开销,这太荒谬了。
【问题讨论】:
-
您正在处理什么样的数据?你考虑过typed arrays吗?
-
奇怪地看到 IE 赢得了一些东西。 :P 编辑:等等,不,它实际上并没有赢得阵列内存开销战争。
-
@Cory 你考虑过惰性求值吗?内存中有数百万个数组——这听起来不像你想要的任何语言,真的。如果你正在做数据可视化,也许有一种方法可以只使用你当时需要的东西。您可能会考虑使用像 Lazy.js 这样的库,特别是如果您计划对这些数据进行大量处理。
-
尝试像这样初始化你的数组:
arr = new Array(10000000);。现代 JS 引擎可以在预先知道数组的大小和类型时进行优化。此外,如果引擎可以保证每个成员中的数据类型相同,他们也可以利用这一点。 -
我尝试使用文字语法
[]而不是new Array(),这一次,我的浏览器没有崩溃。 @Cory,这对你有影响吗? (编辑:好的,浏览器没有崩溃 = 它只是冻结。太好了。)
标签: javascript arrays performance memory