Какие сценарии оправдывают использование алгоритма Map and Reduce?
Есть ли реализация этого алгоритма .NET?
Какие сценарии оправдывают использование алгоритма Map and Reduce?
Есть ли реализация этого алгоритма .NET?
Линк эквиваленты Map и Reduce: Если вам повезло иметь linq, вам не нужно писать свою карту и сокращать функции. С# 3.5 и Linq уже имеют его, хотя и под разными именами.
Карта Select
:
Enumerable.Range(1, 10).Select(x => x + 2);
Уменьшить это Aggregate
:
Enumerable.Range(1, 10).Aggregate(0, (acc, x) => acc + x);
Фильтр Where
:
Enumerable.Range(1, 10).Where(x => x % 2 == 0);
Классы задачи, хорошо подходящие для решения стиля mapreduce, - это проблемы агрегации. Извлечение данных из набора данных. В С# можно использовать 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
Вот 3 метода (из https://github.com/cs-util-com/cscore/blob/master/CsCore/PlainNetClassLib/src/Plugins/CsCore/com/csutil/collections/IEnumerableExtensions.cs):
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. В документе Google на MapReduce есть несколько хороших примеров, включая обработку тысяч веб-страниц, подсчет слов в документе и т.д. И т.д.