【问题标题】:Javascript array 100000 x 100000 - kill my browserJavascript 数组 100000 x 100000 - 杀死我的浏览器
【发布时间】:2014-07-10 20:40:57
【问题描述】:

我正在尝试构造这样的数组(矩阵):

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 的数组。不仅仅是零,而是真正的浮点值。在这种情况下我需要使用服务器端吗?

【问题讨论】:

  • Javascript 是一种解释性语言,这意味着它很慢。
  • 500K * 500K = 2500 亿。即使假设您可以在处理器上每赫兹执行 1 件事,那也应该是非常长的时间。
  • 不只是时间,还有内存,2500 亿 x 64 位
  • @user299448 你在做什么需要这么大的矩阵?数据库不够用吗?
  • 我不知道您要做什么或为什么,但我建议您查看某种GPGPU。如果您需要在浏览器中执行此操作,WebGL 将是您的最佳选择(虽然我没有很多经验,所以我不确定它是否能满足您的需要)。

标签: javascript arrays performance


【解决方案1】:

500Kx500K 对 Javascript 来说实在是太大了(而且足够大到足以让一台合理的计算机窒息),但如果您仍然愿意在客户端处理庞大的数据集,我建议您研究一下: http://square.github.io/crossfilter/

Crossfilter 是一个用于探索大型多元变量的 JavaScript 库 浏览器中的数据集。交叉过滤器支持极快(

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

【讨论】:

  • 我怀疑甚至 crossfilter 可以处理它。我们所说的不仅仅是百万。这是万亿的四分之一。它甚至不适合大多数服务器级机器的内存。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    实际上你没有机会处理它。但好处是,您可能没有机会处理那么多数据。在浏览器中?我想知道如何你一开始会在那里获得数据!

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-02
          • 2022-12-29
          • 1970-01-01
          相关资源
          最近更新 更多