「 Map and Reduce 」アルゴリズムの使用を保証するシナリオは何ですか?
このアルゴリズムの.NET実装はありますか?
MapとReduceに相当するLinq:幸運にもlinqを使用できれば、独自のマップとreduce関数を作成する必要はありません。 C#3.5とLinqは、名前は異なりますが、すでにそれを持っています。
マップはSelect
:
Enumerable.Range(1, 10).Select(x => x + 2);
ReduceはAggregate
です:
Enumerable.Range(1, 10).Aggregate(0, (acc, x) => acc + x);
フィルターはWhere
:
Enumerable.Range(1, 10).Where(x => x % 2 == 0);
Mapreduceスタイルのソリューションに適している問題のクラスは、集約の問題です。データセットからデータを抽出する。 C#では、LINQを利用してこのスタイルでプログラミングできます。
次の記事から: http://codecube.net/2009/02/mapreduce-in-c-using-linq/
groupByメソッドはマップとして機能し、Selectメソッドは中間結果を最終的な結果リストに削減する役割を果たします。
var wordOccurrences = words
.GroupBy(w => w)
.Select(intermediate => new
{
Word = intermediate.Key,
Frequency = intermediate.Sum(w => 1)
})
.Where(w => w.Frequency > 10)
.OrderBy(w => w.Frequency);
分散部分については、DryadLINQを確認できます。 http://research.Microsoft.com/en-us/projects/dryadlinq/default.aspx
LINQがWhere
、Select
、およびAggregate
の代わりにFilter
、Map
、およびReduce
を呼び出すことを覚えていないため、使用できる拡張メソッド:
IEnumerable<string> myStrings = new List<string>() { "1", "2", "3", "4", "5" };
IEnumerable<int> convertedToInts = myStrings.Map(s => int.Parse(s));
IEnumerable<int> filteredInts = convertedToInts.Filter(i => i <= 3); // Keep 1,2,3
int sumOfAllInts = filteredInts.Reduce((sum, i) => sum + i); // Sum up all ints
Assert.Equal(6, sumOfAllInts); // 1+2+3 is 6
public static IEnumerable<R> Map<T, R>(this IEnumerable<T> self, Func<T, R> selector) {
return self.Select(selector);
}
public static T Reduce<T>(this IEnumerable<T> self, Func<T, T, T> func) {
return self.Aggregate(func);
}
public static IEnumerable<T> Filter<T>(this IEnumerable<T> self, Func<T, bool> predicate) {
return self.Where(predicate);
}
https://github.com/cs-util-com/cscore#ienumerable-extensions からの詳細
独自のバージョンのGoogleを作成しようとしていた場合、それはそれを保証するかもしれません。
しかし、真剣に、いくつかの小さな問題に分解できる問題がある場合、Map-Reduceソリューションが機能します。 MapReduce のGoogleドキュメントには、何千ものWebページの処理方法、ドキュメント内の単語のカウント方法など、いくつかの良い例があります。