C# Parallel Kullanımı

C# Parallel Kullanımı

Bu yazımda aslında iyi bildiğimden değil, kendime not niteliğinde bir yazı yazacağım.

BigData (Büyük Veri) dünyası ile iyice artan münasebetim sonrasında, büyük verileri yüksek hızlarda işlemeniz gerekir. Aksi takdirde yapacağınız işlem veya grafik raporlama standart bir yazılımla aynı olacak. Örneklemek gerekirse veritabanından data okuyup hesaplama yaptırmanız ve sonucunda bir rapor elde etmeniz gerektiğini düşünün. Bunu MsSql ile yaparsanız 2 ihtimaliniz var;

  1. Sql Server üzerinde hesaplama yaptırma
  2. Client üzerinde hesaplama yaptırma

Bu 2 madde arasında ki temel fark, yoğun olarak kullanılan bir SQL server’ınız var ise işlem çok uzayacaktır. Client tarafında ise işlem yapmak için ya Linq kullanacaksınız yada daha manuel foreach gibi yapılar ile hesap yaptıracaksınız.

Tüm bunların yanı sıra, birde işin Big Data tarafı var. Bunlara verilebilecek en temel ve bilinen örneklerden biri MongoDB.

MongoDB üzerinde hızlı işlem yapmak istiyorsak şahsi görüşüm mümkün mertebe veritabanına işlem yaptırmamaktan geçiyor. Yani bir decimal veya integer gibi veri tipine sahip alanın toplamını almak istiyorsak direkt olarak kayıt esnasında toplatılıp yazılması en hızlı sonucu verecektir. Peki tüm bunların konu ile ne alakası var derseniz şöyle bir alakası var. Bazı durumlarda bütün dataları salt halde kayıt altına alsanız bile yinede raporlamalar veya işlemler için matematiksel işlemlere ihtiyaç duyabiliyoruz.

Yukarıda bahsetmiş olduğum 1. maddeyi ele alacak olursak MongoDB her ne kadar hızlı olsada data boyutu arttıkça, sunucu trafiği arttıkça vs gibi durumlara bağlı olarak geç cevap verebiliyor. Bunu aşmak için ise Veritabanımız ile kısa süreli bir bağlantı olacaktır. Veritabanında gerekli SELECT işleminden sonra datalarımızı bir List<T> veya DataTable aracılığı ile işlememiz gerekiyor.

Standart bir foreach veya for döngüsü kayıt sayısına bağlı olarak süresi değişecektir, forach veya for yerine Parallel kodunu kullanırsak işler biraz daha değişecektir.

Parallel.ForEach<T>(KayıtDizimiz, new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount }, item => {
//Artık Bu alanda istediğimiz işlemleri yapabiliriz. Aynı Foreach yapsısında olduğu gibi.
});

Yukarıda ki kodu kısaca özetlemek gerekirse İşlemci çekirdek sayımız kadar eş zamanlı işlem yapacak bir döngü elde etmiş olduk. 4 çekirdekli bir işlemcimiz var ise aynı anda 4 kez döngünün içerisine girerek belirttiğimiz işlemleri yapacaktır. Normal bir foreach gibi bütün döngüler bittikten sonra işlemlerine devam eder.

Parallel.ForEach bloğunun içerisinde bir SQL Insert işlemi gerçekleştirmek isterseniz “deadlock” veya bağlantı zaman aşımı gibi hatalar alabilirsiniz. SELECT işlemleri için kullanılırken bir hata ile karşılaşmadım ama INSERT, UPDATE, DELETE gibi komutlar çok can sıkıcı olabiliyor.

Dip Not: “KayıtDizini” olarak belirttiğim değişken türü eğer bir List<> ise döngüde her zaman olmasa da atlamalar yaşanmaktadır en düzgün sonucu bir array ile alabilirsiniz.

Paylaş :

Bu gönderiyi paylaş

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.