【问题标题】:Game of Life memory issue: 3D Array (generations, x, y). Possible to minimize memory usage?Game of Life 内存问题:3D Array (generations, x, y)。可以最小化内存使用吗?
【发布时间】:2014-02-03 08:29:27
【问题描述】:

编辑:一些有用的回复让我意识到我忘记包含一个关键细节。我也在检查振荡,这意味着我必须存储每一代的信息。

我正在用 JavaScript 重新创建生命游戏,需要一个 3D 数组。据我了解,我必须先声明数组的大小,然后才能开始填充它。这很不幸,因为我不知道这款游戏会持续多少代。如果我将其设置为低,游戏可能会突然停止。如果我将其设置为高,浏览器可能会因填满内存而崩溃。这是我声明 3D 矩阵的代码。

    cellMatrix = new Array();

    function declareMatrix() {

        for (var g = 0; g < maxGenerations; g++) {

            cellMatrix[g] = new Array();

            for (var x = 0; x < width; x++) {

                cellMatrix[g][x] = new Array();

                for (var y = 0; y < height; y++) {

                    cellMatrix[g][x][y] = new Array();
                }
            }
        }
    }

主要问题:有没有更节省内存的方法?

没有一个正确答案的奖励问题(抱歉):多少内存使用量太大了?

【问题讨论】:

  • 如果您有 16 个单元,则您必须使用 16 个内存位置。您无法优化阵列存储。
  • 不,JavaScript 数组是动态的并且会自动增长/收缩。即使在您的示例代码中,您也不会“声明数组大小”。
  • 你测量过'maxGeneration'的值吗?
  • maxGenerations 的值是我定义的,在我从这里的答案中了解到我不需要先定义数组的大小之前。我猜是一些认知谬误。

标签: javascript arrays memory memory-management


【解决方案1】:

是的,有一种更节省内存的方法:使用二维数组并即时计算下一代。如果您的用例需要来回跳过很多,您也可以存储每一代,例如,千代并将其用作起点。如果您还没有使用类似 HashLife 的高效算法,可能会对此有所帮助。

实际上,大多数事情都是时间/代码复杂性/内存权衡。总是将每个单元格存储为一个位而不是 4 个以上的字节。

据我所知,我必须先声明数组的大小,然后才能开始填充它。

不在 JavaScript 中。

【讨论】:

    【解决方案2】:

    为什么在开始填充之前必须声明数组的大小?

    您始终可以使用新项目扩展矩阵。好吧,也许你可以告诉我们你想用矩阵做什么。

    在我看来,对于不太复杂的事情来说,太多的内存使用量超过了 100 MB。但也许您更担心数组的大小,这取决于您在其中存储的内容。

    【讨论】:

      猜你喜欢
      • 2022-12-26
      • 1970-01-01
      • 2015-05-07
      • 1970-01-01
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多