Javascript array 100000 x 100000 - 杀了我的浏览器

时间:2014-07-10 20:40:58

标签: javascript arrays performance

我试图构建这样的数组(Matrix):

var arr = [];
var matrix_size = 100000;
var start_time = Math.round(new Date().getTime()) / 1000.0;

for( var i = 0; i < matrix_size ; i++ ) {
   var row = [];
   for( var j = 0; j < matrix_size; j++ ) {
       row.push( 0 );
   }
   arr.push( row );
   if ( counter % 10 == 0 ) {
      var stop_time = Math.round(new Date().getTime()) / 1000.0;
      var speed_time =  stop_time - start_time;
      var speed = i / speed_time; // m / s
      var remain = matrix_size - i;
      var remain_time = remain / speed;
      console.log("Ready: " + i + " rows; remain: " + remain + "; speed: " + speed + "; remain_time: " + remain_time + "s.");
  }
}

var stop_time = Math.round(new Date().getTime()) / 1000.0;
var speed_time =  stop_time - start_time;
console.log( "Time: " + speed_time + " s. ");
  • matrix_size 1000 - 0.1700000762939453秒
  • matrix_size 10000 - 8.978000164031982秒
  • matrix_size 100000 - 卡住

Ready: 1020 rows; remain: 98980; speed: 40.255742648097055; remain_time: 2458.7796296605875s.

真的那么大吗?在这种情况下,浏览器功能的正确数学是什么?

实际上,我需要500,000 x 500,000阵列。不仅仅是零,而是真正的浮动值。在这种情况下我需要使用服务器端吗?

5 个答案:

答案 0 :(得分:2)

500Kx500K对于Javascript来说太过分了(并且足够合理的计算机可以阻塞它),但是如果你仍然愿意在客户端使用大量数据集,我建议你研究一下这个:http://square.github.io/crossfilter/

  

Crossfilter是一个用于探索大型多变量的JavaScript库   浏览器中的数据集。 Crossfilter支持极快(<30ms)   与协调视图的交互,即使是包含数据集的数据集   百万或更多记录。

这不会解决您的问题,但希望它会指出您正确的方向。我建议将您的数据集分成多个部分并分别处理它们。处理小块数据而不是庞大的数据集通常更明智。

答案 1 :(得分:2)

500,000 x 500,000是2500亿个值。 javascript中的每个数字都是8个字节(至少根据Google的快速搜索)。

为了只在内存中存储数字,你需要超过1862.65 GB的内存(不包括数组,浏览器,javascript引擎等所涉及的任何开销)。

即使是服务器端解决方案也会出现这么多数据的问题。您应该花时间重新评估您的问题,并找到减少早期数据集的方法。

答案 2 :(得分:0)

正如其他人在评论中指出的那样,一个500K x 500K的双打矩阵将大约是1.8的内存。

实际上你没有机会处理这个问题。但好处是,您可能无法处理那么多数据。在浏览器中?我想知道如何你首先得到数据!

您还没有描述您尝试解决的实际问题,因此很难为您提供帮助。一些随机提示:

  • 你的matrice可能有500K维,但它可能大部分是空的。您应该考虑使用稀疏数据结构和算法。 稀疏数据结构不会将所有条目存储在内存中。只有那些不为空的
  • 如果您处理大量数据,则应尝试以流式方式处理它。那就是:在数据切片上,永远不要将整个数据集加载到内存中。这不会让它更快,但它可以使可行

答案 3 :(得分:0)

我建议使用数据库来制定数据。由于矩阵太大,您将能够利用数据库的强大功能来处理计算需求。然后,您可以查询数据库并使用服务器端代码(PHP,Python,Java等)来构建JSON对象并以这种方式遍历您的数据。希望对你有帮助。

答案 4 :(得分:-1)

所有JavaScript编号都是双精度浮点数,表示每个8字节。 500K x 500K x 8B的内存大约为2000 GB。因此,在这种情况下所需的“浏览器的强大功能”将是在具有超过2000GB内存的计算机上运行的Web浏览器,以及其JavaScript内存管理器将支持该数量的浏览器(Chrome的V8引擎开始挣扎,根据我的经验,大约2GB )。

相关问题