Javascript数组的内存效率低下

Javascript数组的内存效率低下,javascript,arrays,performance,memory,Javascript,Arrays,Performance,Memory,我正在编写一个用于可视化数据的浏览器应用程序。有大量的数据(数百万行,每行可能有几十个值),在大多数语言中,这些数据的存储开销很小。Javascript似乎将数据存储在比所需空间大几倍的空间中,而不管浏览器是什么,我已经将其缩小到数组实现。下面是一个比较1000万个数字和1000万个阵列的内存存储的示例: 默认用法: Firefox:90Mb 铬:30Mb IE:10Mb 编号: arr = new Array(); for (var i = 0; i < 10000000; i++)

我正在编写一个用于可视化数据的浏览器应用程序。有大量的数据(数百万行,每行可能有几十个值),在大多数语言中,这些数据的存储开销很小。Javascript似乎将数据存储在比所需空间大几倍的空间中,而不管浏览器是什么,我已经将其缩小到数组实现。下面是一个比较1000万个数字和1000万个阵列的内存存储的示例:

默认用法:

Firefox:90Mb

铬:30Mb

IE:10Mb


编号:

arr = new Array();
for (var i = 0; i < 10000000; i++) {
    arr.push(1);
}
arr=newarray();
对于(变量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());
}
arr=newarray();
对于(变量i=0;i<10000000;i++){
arr.push(新数组());
}
Firefox:970Mb-90Mb=880Mb=~88字节/空数组

Chrome:550Mb-30Mb=520Mb=~52字节/空数组

IE:930Mb-10Mb=920Mb=~92字节/空阵列



有人对这种大规模内存使用有什么解释吗?更重要的是,有人有什么解决方案吗?有很多方法可以解决这个问题,但是为每一行使用一个数组会使数据更容易处理。希望有一个解决方案,因为存储1000万行数据会带来千兆字节的开销,这太荒谬了。

我刚刚在Chrome 33.0.1750.152版OS X上的JS控制台中运行了以下代码块:

arr = new Array();
for (var i = 0; i < 10000000; i++) {
    arr.push(1);
}
arr=newarray();
对于(变量i=0;i<10000000;i++){
arr.push(1);
}
我的内存配置文件从52.1 MB增加到68.4 MB=16 MB,每个阵列约1.6字节

当我看到浏览器处于空闲状态时,内存配置文件增加了.2MB,但现在似乎保持稳定

我在控制台上的Safari中运行了相同的代码,内存配置文件实际上略有下降,这向我表明,浏览器的内存配置文件与分配给阵列的存储空间关系不大,而与应用程序中正在发生的任何事情关系更大

更新:

从22.6 MB的Safari Web内容开始,我加载了以下页面:

<html>
<head>

<script>

    function gen(){

        var arr = new Array();
        for (var i = 0; i < 10000000; i++) {
            arr.push(new Array());
        }
        return arr.length;
    }
</script>


</head>
<body onload="alert(gen())">

</body>
</html>

函数gen(){
var arr=新数组();
对于(变量i=0;i<10000000;i++){
arr.push(新数组());
}
返回arr.length;
}

Safari Web内容从22.6MB增加到656.7MB,然后在警报触发后又下降到22.8MB。似乎每个数组都分配了一定数量的RAM,不管它是否包含任何内容,这对我来说很有意义,因为在Javascript中,数组是对象的子类。

您使用的是什么类型的数据?你考虑过吗?看到我赢了什么东西很奇怪P Edit:等等,不,它实际上并没有赢得阵列内存开销之战。@Cory你考虑过延迟评估吗?内存中有数以百万计的数组——这听起来不像是任何语言都需要的,真的。如果您正在进行数据可视化,也许有一种方法可以只使用您当时需要的内容。你可能会考虑一个库,特别是如果你打算做大量的数据处理。尝试初始化你的数组,比如::代码> ARR=新数组(10000000);<代码>。现代JS引擎可以在提前知道阵列的大小和类型时进行优化。此外,如果引擎可以保证每个成员中都有相同类型的数据,它们也可以利用这一点。我尝试使用文本语法
[]
而不是
新数组()
,这次,我的浏览器没有崩溃@科里,这对你有影响吗?(编辑:好的,浏览器没有崩溃=它只是冻结了。太好了。)罗伯特,你没有错——但这不是一个数组数组,正如OP测试的那样。我不知道控制台的事情。那很酷。我在控制台的第二台计算机上试用了它,那里也有大量内存。我怀疑Windows和OSX会有这么大的不同。可能不同的浏览器设置?我将尝试寻找一些东西。@Robert Chrome不喜欢我尝试这样做-我尝试使用数组文字
[]
,但我的实例冻结了。如果使用数组文字与使用新数组()相比,结果是否不同?“好奇心占据了我的上风。”午餐肉,铬合金似乎也适合arr.push([])。我会注意到Google Chrome Helper内存配置文件在下降到40 MB之前上升到324 MB,而Google Chrome进程本身保持不变。这些代码都没有导致我崩溃。gen函数创建的数组没有保存在内存中,可能会被垃圾收集。这就是为什么在触发警报后,您的内存下降到~22 MB。