Crear mapa y reducir funciones en C#

Syed Hassan Sabeeh Kazmi 12 octubre 2023
  1. Utilice LINQ para crear funciones Mapa y Reducir en C#
  2. Crear funciones Mapa y Reducir desde cero en C#
Crear mapa y reducir funciones en C#

Las funciones Map y Reduce en C# están desarrolladas para escribir algoritmos para procesar una gran cantidad de datos sin procesar. El cómputo paralelo permite a los desarrolladores procesar escalas tan masivas de datos distribuidos para ejecutar el cómputo requerido cerca de donde se encuentran los datos.

En este tutorial, aprenderá dos métodos diferentes para usar y crear las funciones Mapa y Reducir y su implementación en C#. Puede escribir estas funciones desde cero o con la ayuda de LINQ mientras oculta las complejidades de la paralelización, la distribución de datos, la tolerancia a fallas, etc.

Tanto las funciones Mapear como Reducir se ejecutan en un conjunto independiente de datos de entrada, y cada función procesa su fuente de datos.

El grupo Mapear y Reducir involucra múltiples computadoras que introducen una complejidad adicional en el proceso. Los desarrolladores de C# deben estar familiarizados con la programación y el bloqueo de subprocesos múltiples al escribir algoritmos de programas Map y Reduce ejecutados en paralelo.

Utilice LINQ para crear funciones Mapa y Reducir en C#

Las funciones Mapear y Reducir implementan varios algoritmos matemáticos para dividir tareas en partes pequeñas y asignarlas a múltiples sistemas. En términos técnicos, el algoritmo Asignar y Reducir ayuda a enviar la clasificación, búsqueda, indexación y otras tareas de Asignar y Reducir a los servidores apropiados en un clúster.

Si bien las funciones Map y Reduce que usan LINQ son enfoques ágiles y resistentes para resolver problemas de big data, su complejidad inherente significa que los desarrolladores de C# necesitan tiempo para adquirir experiencia. La ejecución lógica de un programa simple Mapear y Reducir se ve así:

// Logical execution

map(String key, String value):
    // key: it holds the name of a document
    // value: it holds the content of a document
    for each word i in value:
        EmitIntermediate(i, "1");

reduce(String key, Iterator values):
    // key: it represents a word
    // values: it holds the values of a work
    int result = 0;
    for each x in values:
        resultReduce += ParseInt(x);
    Emit(AsString(resultReduce));

La programación funcional en C# con LINQ es un enfoque popular para escribir algoritmos. LINQ y C# 3.5 y superior tienen funciones similares con diferentes nombres.

  1. El Mapa es para Seleccionar | Enumerable.Rango(1, 10).Seleccionar(x => x + 2);.
  2. El Reducir es para Agregar | Enumerable.Rango(1, 10).Agregado(0, (acc, x) => acc + x);.

Usando LINQ, puede implementar los programas Mapa y Reducir descritos anteriormente:

Función Map en C# usando LINQ:

// Add `System.Linq` and `System.Collections.Generic` namespace references in your C# project before
// executing the code
using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;

// Map function in C# using LINQ
namespace MapReduce {
  class ProgramMap {
    static void Main(string[] args) {
      var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
      var result = numbers.Select(x => x * x).ToArray();
      foreach (var n in result) Write(n + " ");
      Console.Read();
    }
  }
}

Función Reducir en C# usando LINQ:

// Add `System.Linq` and `System.Collections.Generic` namespace referances in your C# project before
// executing the code
using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;

// Reduce function in C# using LINQ
namespace MapReduce {
  class ProgramMap {
    static void Main(string[] args) {
      var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
      var result = numbers.Aggregate((acc, x) => acc + x);
      WriteLine($"Sum = {result}");
      Console.Read();
    }
  }
}

Map y Reduce en C# manejan grandes cantidades de datos, y muchos marcos como MapReduce y Hadoop implementan estas funciones. El programa de C# Map y Reduce que usa LINQ ilustra los procesos que se ejecutan en una sola computadora donde varios subprocesos se asignan simultáneamente a varias porciones de los datos de entrada, colocando los resultados del mapeo en una ubicación centralizada para su posterior procesamiento por parte de otros subprocesos donde Reduce opera.

Crear funciones Mapa y Reducir desde cero en C#

Cuando trabaja con bases de datos relacionales y se encuentra con la agregación de datos, inmediatamente piensa en una cláusula GroupBy y las operaciones estándar, como Min, Max y Count. Las funciones mapa y reducir en C# son una forma de agregación de datos donde puede tomar una gran cantidad de información y reducirla en partes más pequeñas.

Antes de reducir, puede traducir (mapear) la información en un diseño estructural para el proceso de reducción personalizado. El Mapa es una función de orden superior que toma una función, y una lista aplica esa función a cada lista y devuelve la lista resultante.

Dada la función x = x + 2, y una lista de números enteros 1 -> 3. La siguiente es la implementación en C# de la función Mapa:

static void Main(string[] args) {
  var testList = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  var mapList = Map<int, int>(x => x + 2, testList);

  mapList.ToList<int>().ForEach(i => Console.Write(i + " "));
  Console.WriteLine();
  Console.ReadKey();
}

static IEnumerable<TResult> Map<T, TResult>(Func<T, TResult> func, IEnumerable<T> list) {
  foreach (var i in list) yield return func(i);
}

Producción :

3 4 5 6 7 8 9 10 11 12

Reducir toma una lista de elementos y devuelve una función aplicada a todos los elementos de esa lista. Dada la función (x, t) => x + y, y una lista de elementos 1 a 3, la implementación en C# de la función Reducir será:

static void Main(string[] args) {
  var testList = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
  Console.WriteLine(Reduce<int, int>((x, y) => x + y, testList, 0));
  Console.ReadKey();
}

static T Reduce<T, U>(Func<U, T, T> func, IEnumerable<U> list, T acc) {
  foreach (var i in list) acc = func(i, acc);

  return acc;
}

Producción :

55

Las funciones Map y Reduce como abstracciones de orden superior ocultan la paralelización de las funciones inferiores.

En C#, el sistema subyacente se encarga de ejecutar y administrar la ejecución de las funciones Map y Reduce, y la complejidad y la sofisticación reales se pueden evitar escribiendo una por sí mismo.

En este tutorial, ha aprendido los conceptos básicos de Map y Reduce y cómo crearlos y usarlos en C#.

Con o sin LINQ en C#, las funciones Map y Reduce brindan un enfoque innovador para el consumo rápido de tareas de procesamiento de datos extremadamente grandes y complejas. El lenguaje C# es muy adecuado para el procesamiento Map y Reduce.

Con la ayuda de las funciones Mapa y Reducir, se pueden acomodar tareas de procesamiento de datos de casi cualquier tamaño.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

Artículo relacionado - Csharp Function