使用CouchDb map / reduce的不同阵列组件的最小和最大速度更快?

时间:2011-03-09 15:09:11

标签: couchdb mapreduce

我有一个CouchDB数据库,其视图的值是[x,y]形式的配对数字。对于具有相同密钥的文档,我需要(同时)计算x的最小值和y的最大值。我正在使用的数据库包含大约50000个文档。构建视图需要几个小时,这似乎有些过分。 (键本身是长度为三个数组。)我在下面显示地图和减少功能,但基本问题是:如何加快这个过程?

请注意,内置函数不起作用,因为值必须是数字,而不是长度为两个数组。我可以制作两个不同的视图(一个用于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]);
}

3 个答案:

答案 0 :(得分:2)

还有两个笔记。使用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将值视为字符串,那是因为您将它们作为字符串存储在文档中。

希望它有所帮助。

答案 1 :(得分:1)

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

另一个因素不太明显,只能通过制作较小版本的数据库并记录reduce函数中的步骤来找到。虽然“值”中的条目是整数,但它们被CouchDB视为字符串。使用parseInt函数纠正了这个问题。

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

答案 2 :(得分:0)

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