C# で Map 関数と Reduce 関数を作成する

Syed Hassan Sabeeh Kazmi 2023年10月12日
  1. LINQ を使用して C#Map 関数と Reduce 関数を作成する
  2. C#Map 関数と Reduce 関数をゼロから作成する
C# で Map 関数と Reduce 関数を作成する

C# の Map および Reduce 関数は、大量の生データを処理するためのアルゴリズムを記述するために開発されました。 並列コンピューティングを使用すると、開発者はこのような大規模な分散データを処理して、データが配置されている場所の近くで必要な計算を実行できます。

このチュートリアルでは、Map 関数と Reduce 関数を使用および作成する 2つの異なる方法と、C# でのそれらの実装について学習します。 これらの関数は、並列化、データ分散、フォールト トレランスなどの複雑さを隠しながら、ゼロから作成するか、LINQ を使用して作成できます。

Map 関数と Reduce 関数はどちらも独立した入力データ セットで実行され、各関数はそのデータ ソースを処理します。

Map および Reduce クラスターには複数のコンピューターが含まれるため、プロセスがさらに複雑になります。 C# 開発者は、並行して実行される Map および Reduce プログラムのアルゴリズムを記述する場合、マルチスレッド プログラミングとロックに精通している必要があります。

LINQ を使用して C#Map 関数と Reduce 関数を作成する

Map および Reduce 関数は、さまざまな数学的アルゴリズムを実装して、タスクを小さな部分に分割し、それらを複数のシステムに割り当てます。 技術的には、Map および Reduce アルゴリズムは、並べ替え、検索、インデックス作成、およびその他の Map および Reduce タスクをクラスター内の適切なサーバーに送信するのに役立ちます。

LINQ を使用した Map 関数と Reduce 関数は、ビッグ データの問題を解決するためのアジャイルで回復力のあるアプローチですが、C# 開発者が専門知識を得るには時間がかかることを意味します。 単純な Map および Reduce プログラムの論理的な実行は、次のようになります。

// 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));

LINQ を使用した関数型 C# プログラミングは、アルゴリズムを記述するための一般的なアプローチです。 LINQ と C# 3.5 以降には、異なる名前で同様の関数があります。

  1. MapSelect | Enumerable.Range(1, 10).Select(x => x + 2);.
  2. ReduceAggregate | Enumerable.Range(1, 10).Aggregate(0, (acc, x) => acc + x);.

LINQ を使用すると、上記の Map および Reduce プログラムを実装できます。

LINQ を使用した C# の Map 関数:

// 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();
    }
  }
}

LINQ を使用した C# の Reduce 関数:

// 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();
    }
  }
}

C# のMapReduceは大量のデータを処理し、MapReduceHadoopなどの多くのフレームワークがこれらの機能を実装しています。 LINQ を使用したMapおよびReduceC# プログラムは、複数のスレッドが入力データのさまざまな部分に同時にマップされ、マッピング結果を集中化された場所に配置して、他のスレッドがさらに処理できるようにする単一のコンピューター上で実行されるプロセスを示しています。 動作します。

C#Map 関数と Reduce 関数をゼロから作成する

リレーショナル データベースを操作していてデータの集計に出くわすと、すぐに GroupBy 句と、MinMaxCount などの標準操作を思い浮かべます。 C# の Map および reduce 関数は、大量の情報を取得して小さなチャンクに削減できるデータ集約の形式です。

削減する前に、情報をカスタム削減プロセスの構造設計に変換 (マップ) できます。 Map は関数を受け取る高階関数で、リストはその関数を各リストに適用し、結果のリストを返します。

関数 x = x + 2 と整数のリスト 1 -> 3 が与えられます。 以下は、Map 関数の C# 実装です。

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);
}

出力:

3 4 5 6 7 8 9 10 11 12

Reduceは要素のリストを受け取り、そのリストのすべての要素に適用される関数を返します。 関数 (x, t) => x + y と要素のリスト 1 ~ 3 を指定すると、Reduce 関数の C# 実装は次のようになります。

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;
}

出力:

55

上位の抽象化としてのMapおよびReduce関数は、下位の関数への並列化を隠します。

C# では、基礎となるシステムが Map および Reduce 関数の実行と実行を管理します。実際の複雑さと複雑さは、自分で作成することで回避できます。

このチュートリアルでは、MapReduce の基本的な概念と、C# でそれらを作成して使用する方法を学びました。

C# の LINQ の有無にかかわらず、Map および Reduce 関数は、非常に大規模で複雑なデータ処理タスクを迅速に処理するための革新的なアプローチを提供します。 C# 言語は、Map および Reduce 処理に適しています。

Map および Reduce 関数の助けを借りて、ほぼすべてのサイズのデータ処理タスクに対応できます。

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

関連記事 - Csharp Function