10 Mart 2016 Perşembe

PLINQ

PLINQ

PLINQ .Net Framework 4.0 ile gelen güzel özelliklerden biri. PLINQ çalışmak için Task Parallel Library kütüphanesine kullanır. Klasik Linq ile çok benzeşir.

PLINQ ile çalışabilmek için üzerinde paralel işlem yapılacak olan IEnumerable listesinin hafızada (RAM) yüklü  olması gerekir.

Cancellation ve Exception
Paralel programlama cancellation ve exception önemli iki mevzu. İyi bir çatının bu iki özelliği de kolay kullanılır bir şekilde sunması gerekir.

ParallelEnumerable sınıfı
Bu sınıf verilen bir IEnumerable nesnesini paralel çalışılabilecek hale getiriyor. Aynı zamanda IEnumerable arayüzünün istediği metodları da gerçekleştiriyor.

Kavramlar
Önce kavramlara bakalım.

ParallelEnumerable sınıfı Parallel Aggreation için imkan sunar. Sınıf sayesinde iş küçük parçalara bölünür. Daha sonra Sum(),Aggregate gibi metodlarla sonuçlar birleştirilir.

Parallel Aggregation Nedir
PLINQ ve Aggregation yazısına taşıdım.

Metodlar
Şimdi metodlara göz atalım.

AsParallel metodu
Bu metod verilen listeyi ParallelEnumerable listelerine çevirir.
myList.AsParallel().ForAll(s =>{...});
ParallelEnumerable aslında sadece LINQ metodlarının paralel olarak kullanılabilmesini sağlayan bir wrapper gibi düşünülebilir. Select, Where gibi cümlelerin AsParallel() sonrasında çağrılması gerekir.
Enumerable.Range(0, 1000)
          .AsParallel()
          .Select(...)
          .Where(x => ...);
Şu kullanım şekli yanlıştır.
Enumerable.Range(0, 1000)
          .Select(...)
          .Where(x => ...)
          .AsParallel();

AsParallel metodu dizinin sırasını değiştirir.

PLINQ verilen sorguyu çalıştıtırken IEnumerable listesini bölmek için iki yöntem kullanabilir.
1. Chunk Partitioning
2. Range Partitioning

Her iki yöntemin nasıl çalıştığını gösteren bir şekli burada buldum.

AsOrdered metodu
Bu metod ile girdi olarak verilen veri yapısının sırası çıktıda korunuyor.
myList.AsParallel()
      .AsOrdered()
      .Select(element => ...));
ForEach metodu
Bu metod ile C#'taki foreach döngüsü paralel olarak gerçekleştiriliyor.

WithDegreeOfParallelism metodu
PLINQ otomatik olarak sistemdeki tüm kaynakları kullanmaya çalışır. Eğer kullanılan CPU sayısını sınırlamak gerekirse WithDegreeOfParallelism() metoduna kaç tane CPU kullanılmasını istendiği verilebilir.
Örneği buradan aldım.

PLINQ ile kullanılan her sorgu paralel çalışmak zorunda değildir. Bilhassa .Net 4.5 ve .Net 4.0 arasında bile farklar bulunmakta. Aşağıdaki şekilde mavi ile işaretlenenler paralel çalışmayan sorgu metodları görülebilir.

Hiç yorum yok:

Yorum Gönder