【问题标题】:faster min and max of different array components with CouchDb map/reduce?使用 CouchDb map/reduce 更快地获取不同数组组件的最小值和最大值?
【发布时间】:2011-03-09 15:09:11
【问题描述】:

我有一个带有视图的 CouchDB 数据库,其值是 [x,y] 形式的成对数字。对于具有相同键的文档,我需要(同时)计算 x 的最小值和 y 的最大值。我正在使用的数据库包含大约 50000 个文档。构建视图需要几个小时,这似乎有些过分。 (键本身就是长度为三的数组。)我在下面展示了 map 和 reduce 函数,但基本问题是:我怎样才能加快这个过程?

请注意,内置函数不起作用,因为值必须是数字,而不是长度为 2 的数组。有可能我可以制作两种不同的视图(一种用于 min(x),一种用于 max(y)),但我不清楚如何将它们结合起来以同时获得两种结果。

我目前的地图功能看起来基本像

function(doc) {
  emit ([doc.a, doc.b, doc.c], [doc.x, doc.y])
}

我的 reduce 函数看起来像

function(keys, values) {
  var x = null;
  var y = null;
  for (i = 0; i < values.length; i++) {
    if (values[i][0] == null) break;
    if (values[i][1] == null) break;
    if (x == null) x = values[i][0];
    if (y == null) y = values[i][1];
    if (values[i][0] < x) x = values[i][0];
    if (values[i][1] > y) y = values[i][1];
  }
  emit([x, y]);
}

【问题讨论】:

    标签: couchdb mapreduce


    【解决方案1】:

    还有两个音符。使用 Math.max() 和 Math.min() 应该会快一点。

    function(keys, values) {
      var x = -Infinity,
          y = Infinity;
      for (var i = 0, v; v = values[i]; i++) {
        x = Math.max(x, v[0]);
        y = Math.min(y, v[1]);
      }
      return [x, y];
    }
    

    如果 CouchDB 将值视为字符串,那是因为您将它们作为字符串存储在文档中。

    希望对你有帮助。

    【讨论】:

    • 我没有尝试过 Math.max,因为我不确定它是如何处理 null 的。 (我在 R 中工作了很多,其中最接近 null 的等效项是 NA,它吸收了算术运算中的所有数字。)但是,运行测试确认 Math.max 忽略了 null,因此在这里也有效。
    • 不完全是。 Math.max 不会忽略 null,它会将其视为 0。例如:“Math.max(null, 1) == 1”、“Math.max(null, -1) == 0”。以下所有测试都为真:“-1 -1”和“null >= 0”。这就是我使用 -Infinity 作为起始值的原因。
    【解决方案2】:

    结果证明这是两个因素的结合。一个在上面发布的代码中很明显,当它应该使用“return”时使用“emit”。

    另一个因素不太明显,只有通过制作较小版本的数据库并将步骤记录在 reduce 函数中才能发现。尽管“值”中的条目是整数,但它们被 CouchDB 视为字符串。使用 parseInt 函数可以解决这个问题。

    在这两个修复之后,缩小视图的整个构建大约需要五分钟,因此速度问题消失了。

    【讨论】:

      【解决方案3】:

      请查看http://www.geeksforgeeks.org/archives/4583 。这可能会扩展到您的应用程序。

      【讨论】:

        猜你喜欢
        • 2013-02-25
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 2010-11-23
        • 2011-08-16
        • 2017-12-13
        • 2023-03-18
        • 2011-03-04
        相关资源
        最近更新 更多