2

たとえば、これは行の合計と長さを返す関数です。

function(key, values, rereduce) {
  var result = {total: 0, count: 0};
  for(i=0; i < values.length; i++) {
    if(rereduce) {
        result.total = result.total + values[i].total;
        result.count = result.count + values[i].count;
    } else {
        result.total = sum(values);
        result.count = values.length;
    }
  }
  return(result);
}

定義する必要があるようです:

  • すべての要素を削減する方法。
  • 部分還元をグループ化する方法 (??)

なぜこれはとても奇妙ですか?従来のアプローチは、次のように簡単に説明できます。

reduce = {
    op: function(accumulated,val){
        return {total:accumulated.total + val, count:accumulated.count++};
    },
    initial: {total:0, count:0}
}

配列全体を削減し、新しい値に更新するのに十分な情報を保持しています...!

4

1 に答える 1

2

reduceストレージ/キャッシュが容易になるため、このフェーズは反復的です。reduce 関数の結果をツリーとして想像する必要があります。ノードの特定の連続したサブセットを削減するには、事前に計算された削減値 (およびいくつかの元の削減値) を大部分使用できます。これにより、ツリー全体を下降したり、ノード内のすべてのノードの値を再計算したりする必要がなくなります。クエリ範囲。

少し説明が難しいので、少しは理解していただければ幸いです。

于 2013-03-29T13:43:27.453 に答える