【问题标题】:Couchdb reduce shrink rate check denies the viewCouchdb减少收缩率检查拒绝视图
【发布时间】:2012-11-05 13:58:31
【问题描述】:

我知道这已经讨论了很多次,但我认为我的场景是因为禁用速率限制检查而大喊大叫:

文档格式为:

{ prefix: "004945", country: "Germany", type: "Mobile", carrier: "OrangeTel", price: "34"}
{ prefix: "004946", country: "Germany", type: "Mobile", carrier: "SomeOther", price: "46"}
.
.
.
{ prefix: "00807", country: "Unknown", type: "Satelite", carrier: "Inmarsat", price: "123"}

现在我想获取这些前缀的数组,一些 [country, type, carrier] 键或 [country, type]

所以我这样映射:

emit( [country, type, carrier],[prefix] ) 我像这样减少:

reduce: function(keys, values, rereduce) { 
           return values.reduce(function(a, b) {return a.concat(b);})
        }

问题是收缩率不够好,因为显然我以不同的形状返回相同数量的数据:我将一个包含许多元素的列表转换为一个包含少量元素的列表,每个元素都有很多数据。

我知道我可以使用列表函数等解决它,但我认为该方案对于禁用检查是有效的。此外,如果它存在,我想要任何使用 map-reduce 解决方案而不改变这些文档结构的想法。谢谢。

【问题讨论】:

    标签: mapreduce couchdb


    【解决方案1】:

    reduce 函数的主要任务是对 map 函数产生的结果进行归约。

    由于您的 map 函数发出 [prefix] 作为值,[prefix] 对于每个键都是不同的,并且您想减少/分组键,可能您也有兴趣不看到每个组的 [prefix] 重复,对吧?

    下一个 reduce 函数从 values 数组中创建一个集合,并且应该为您的键生成唯一且简短的 [prefix]-es 列表,并且它不会受到逃避率问题的影响。如果您需要计算缩减键出现了多少不同的前缀,这将是另一个函数,但目标是相同的:reduce reduce 和 rereduce long list of values(:

    function(keys, values, rereduce){
      var prefixes = [];
      var update_set = function(src, dst){
        for (var idx in src){
          item = src[idx];
          if (dst.indexOf(item) == -1){
            dst.push(item);
          }
        }
        return dst;
      }
      if (rereduce){
        for (var idx in values){
          update_set(values[idx], prefixes);
        }
      }
      else{
        update_set(values, prefixes);
      }
      return prefixes;
    }
    

    【讨论】:

    • 我看不出,你的减少乐趣与我的不同,除了它迎合重复的事实。您本质上不是通过连接传递的值来创建返回值吗?收缩率检查器测量输出的大小,因此您的 reduce 不会使事情变得更好,因为如果不存在相同视图键的重复值非常罕见。
    • 如果需要,您可以连接值而不是将它们单独存储在数组中,但是不,此变体不会由于收缩率而失败,因为返回的值将至少等于初始值列表,而不是更大的他们。但是,您可以通过查看 [源代码][github.com/apache/couchdb/blob/master/share/server/… 自己证明这一点 - 请注意,结果不应至少比初始值长两倍。由于N 是所有values 项目,而M 是唯一的values 项目,M
    • 我的 [国家、类型、运营商] 视图键是 aprox。 40.000 。其中只有 3 个重复的前缀。无论如何,我检查了你的函数,它返回相同的收缩率错误......我认为结果应该最多是输入大小的一半而不是相反......我会看看代码。
    • 嗯..在发布您的示例数据之前,我已经对其进行了测试,所以它为什么会失败。您能否将问题数据的样本上传到某个地方(例如 iriscouch)让我使用它。只是也很有趣如何以及为什么...
    • 我找到了原因:在你上面提到的源代码中,当 2 * reduce length > input length 时会抛出错误。因此,基本上我应该至少将每个 reduce 的输出减半,以免引发收缩率错误。
    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2016-06-24
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    相关资源
    最近更新 更多