Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Równoległe kwerendy danych Jarosław Kuchta Programowanie Współbieżne.

Podobne prezentacje


Prezentacja na temat: "Równoległe kwerendy danych Jarosław Kuchta Programowanie Współbieżne."— Zapis prezentacji:

1 Równoległe kwerendy danych Jarosław Kuchta Programowanie Współbieżne

2 2PLINQ Podstawy LINQ – Language-Integrated Query LINQ – Language-Integrated Query język zapytań wbudowany w C# począwszy od wersji 3. język zapytań wbudowany w C# począwszy od wersji 3. PLINQ – Parallel LINQ PLINQ – Parallel LINQ równoległa wersja LINQ równoległa wersja LINQ

3 3PLINQ Przykład wyrażenia LINQ // The Three Parts of a LINQ Query: // The Three Parts of a LINQ Query: // 1. Data source. // 1. Data source. int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; // 2. Query creation.// numQuery is an IEnumerable // 2. Query creation.// numQuery is an IEnumerable var numQuery = var numQuery = from num in numbers from num in numbers where (num % 2) == 0 where (num % 2) == 0 select num; select num; // 3. Query execution. // 3. Query execution. foreach (int num in numQuery) foreach (int num in numQuery) Console.Write("{0,1} ", num); Console.Write("{0,1} ", num);

4 4PLINQ Źródła danych dla LINQ tablice C# tablice C# łańcuchy znaków łańcuchy znaków kolekcje i listy.NET kolekcje i listy.NET bazy danych SQL bazy danych SQL zbiory danych ADO.NET zbiory danych ADO.NET dokumenty XML dokumenty XML …

5 5PLINQ Równoległa wersja wyrażenia LINQ // The Three Parts of a LINQ Query: // The Three Parts of a LINQ Query: // 1. Data source. // 1. Data source. int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; // 2. Query creation.// numQuery is an IEnumerable // 2. Query creation.// numQuery is an IEnumerable var numQuery = var numQuery = from num in numbers.AsParallel() from num in numbers.AsParallel() where (num % 2) == 0 where (num % 2) == 0 select num; select num; // 3. Query execution. // 3. Query execution. foreach (int num in numQuery) foreach (int num in numQuery) Console.Write("{0,1} ", num); Console.Write("{0,1} ", num);

6 6PLINQ foreach a ForAll foreach (int num in numQuery) aBag.Add(Compute(num))); aBag.Add(Compute(num))); numQuery.ForAll ( (num) => aBag.Add(Compute(num)) ); ( (num) => aBag.Add(Compute(num)) );

7 7PLINQ Porównanie foreach i ForAll

8 8PLINQ Zalety i wady PLINQ PLINQ dobrze się sprawdza, gdy: PLINQ dobrze się sprawdza, gdy: elementy kolekcji są niezależne od siebie elementy kolekcji są niezależne od siebie operacje łatwo dzielą się na niezależne wątki operacje łatwo dzielą się na niezależne wątki pojedyncza operacja jest "dość długotrwała" pojedyncza operacja jest "dość długotrwała" Kosztem PLINQ jest narzut na: Kosztem PLINQ jest narzut na: podział danych ze źródła danych podział danych ze źródła danych podział zadań na wątki podział zadań na wątki zebranie danych z wątków zebranie danych z wątków scalenie wyników scalenie wyników

9 9PLINQ Przykłady Opłacalne: Opłacalne: var queryA = from num in numberList.AsParallel() select ExpensiveFunction(num); select ExpensiveFunction(num); Nieopłacalne: Nieopłacalne: var queryB = from num in numberList.AsParallel() where num % 2 > 0 where num % 2 > 0 select num; select num;

10 10PLINQ Sekwencyjne wykonanie PLINQ PLINQ próbuje wykonać kwerendę przynajmniej tak samo szybko, jak LINQ. PLINQ próbuje wykonać kwerendę przynajmniej tak samo szybko, jak LINQ. Przełącza się na wykonanie sekwencyjne, gdy zawiera klauzule: Przełącza się na wykonanie sekwencyjne, gdy zawiera klauzule: Select, indeksowaną Where, indeksowaną SelectMany lub ElementAt po zmianie kolejności lub filtrowaniu kolekcji wejściowej, Select, indeksowaną Where, indeksowaną SelectMany lub ElementAt po zmianie kolejności lub filtrowaniu kolekcji wejściowej, Take, TakeWhile, Skip lub SkipWhile po zmianie kolejności kolekcji wejściowej, Take, TakeWhile, Skip lub SkipWhile po zmianie kolejności kolekcji wejściowej, Concat, Reverse, Zip lub SequenceEquals, chyba że kolekcja wejściowa jest oryginalnie indeksowana Concat, Reverse, Zip lub SequenceEquals, chyba że kolekcja wejściowa jest oryginalnie indeksowana

11 11PLINQ Wymuszone wykonanie równoległe static void ForceParallel() { var customers = GetCustomers(); var customers = GetCustomers(); var parallelQuery = (from cust in customers.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism) var parallelQuery = (from cust in customers.AsParallel().WithExecutionMode(ParallelExecutionMode.ForceParallelism) where cust.City == "Berlin" where cust.City == "Berlin" select cust.CustomerName) select cust.CustomerName).ToList();.ToList();}

12 12PLINQ Określenie liczby procesorów var query = from item in source.AsParallel().WithDegreeOfParallelism(2) where Compute(item) > 42 select item;

13 13PLINQ Kwerenda równoległa z uporządkowaniem var orderedCities = (from city in cities.AsParallel().AsOrdered() where city.Population > where city.Population > select city) select city).Take(1000);.Take(1000);

14 14PLINQ Samodzielne partycjonowanie danych / Static partitioning requires indexable source. Load balancing can use any IEnumerable. var nums = Enumerable.Range(0, ).ToArray(); // Create a load-balancing partitioner. Or specify false for static partitioning. Partitioner customPartitioner = Partitioner.Create(nums, true); // The partitioner is the query's data source. var q = from x in customPartitioner.AsParallel() select x * Math.PI; select x * Math.PI; q.ForAll((x) => { ProcessData(x); ProcessData(x);});

15 15PLINQ Wizualizacja równoległości

16 16PLINQ Literatura us/library/dd aspx us/library/dd aspx


Pobierz ppt "Równoległe kwerendy danych Jarosław Kuchta Programowanie Współbieżne."

Podobne prezentacje


Reklamy Google