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 以降には、異なる名前で同様の関数があります。
Map
はSelect | Enumerable.Range(1, 10).Select(x => x + 2);
.Reduce
はAggregate | 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# のMap
とReduce
は大量のデータを処理し、MapReduce
やHadoop
などの多くのフレームワークがこれらの機能を実装しています。 LINQ を使用したMap
およびReduce
C# プログラムは、複数のスレッドが入力データのさまざまな部分に同時にマップされ、マッピング結果を集中化された場所に配置して、他のスレッドがさらに処理できるようにする単一のコンピューター上で実行されるプロセスを示しています。 動作します。
C#
で Map
関数と Reduce
関数をゼロから作成する
リレーショナル データベースを操作していてデータの集計に出くわすと、すぐに GroupBy
句と、Min
、Max
、Count
などの標準操作を思い浮かべます。 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
関数の実行と実行を管理します。実際の複雑さと複雑さは、自分で作成することで回避できます。
このチュートリアルでは、Map
と Reduce
の基本的な概念と、C# でそれらを作成して使用する方法を学びました。
C# の LINQ の有無にかかわらず、Map
および Reduce
関数は、非常に大規模で複雑なデータ処理タスクを迅速に処理するための革新的なアプローチを提供します。 C# 言語は、Map
および Reduce
処理に適しています。
Map
および Reduce
関数の助けを借りて、ほぼすべてのサイズのデータ処理タスクに対応できます。
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