Карта и сокращение в .NET
Какие сценарии оправдывают использование алгоритма Map and Reduce?
Есть ли реализация этого алгоритма .NET?
Ответы
Ответ 1
Линк эквиваленты 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);
https://www.justinshield.com/2011/06/mapreduce-in-c/
Ответ 2
Классы задачи, хорошо подходящие для решения стиля 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
Ответ 3
Смотрите другой вопрос относительно карты/сокращения:
Расширения общего списка в С#
Ответ 4
Так как я никогда не могу вспомнить, что 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 :
![enter image description here]()
Ответ 5
Если вы пытались написать свою собственную версию Google, то это может быть оправдано..!!!
Серьезно, хотя, если у вас есть проблема, которую вы можете разложить на несколько меньших проблем, тогда будет работать решение Map-Reduce. В документе Google на MapReduce есть несколько хороших примеров, включая обработку тысяч веб-страниц, подсчет слов в документе и т.д. И т.д.