2013-05-07 7 views
18

Parallel.Foreach döngüsünü ön tanımlı olarak kullanmak için bir yol bilen var mı, varsayılan olarak aralık bölümleme olduğunu inanıyorum. Dizilerle çalışırken basit görünür, çünkü yalnızca özel bir bölümleyici oluşturabilir ve yük dengelemeyi doğru olarak ayarlayabilirsiniz.Chunk bölümleme Paralel olarak IEnumerable.Foreach

IEnumerable öğesindeki öğelerin sayısı çalışma zamanına kadar bilinmediğinden, yığın bölümlemeyi işe almak için iyi bir yol bulmak gibi görünmüyor.

Herhangi bir yardım için teşekkür ederiz.

Teşekkürler!

Her nesnede gerçekleştirmeye çalıştığım görevler, gerçekleştirilmesi için önemli ölçüde farklı zaman alıyor. Sonunda işini bitirmek için son iş parçacığı için genellikle bekliyorum. Elde etmeye çalıştığım şey, her iş parçacığına öğeleri önceden ayırmak yerine, paralel döngü isteği parçalarını oluşturmaktır.

+0

Niçin bunu istiyorsunuz (ilgi çekici) –

+0

Parçaların sayısı veya yığın büyüklüğü tarafından daha fazla mı topluyorsunuz? – SimpleVar

+0

IEnumerable'ınız var mı, yoksa bir indeksleyiciyi uygulayan bir şey var mı (bu yüzden üzerinde 'obj [i]' yapabilirdiniz)? Bir endekste geçebiliyorsanız bir çözümüm var. –

cevap

19

sizin IEnumerable gerçekten bir dizin yazmak gerekir o yapamazsanız (bir öğeyi almak için obj[1] yapabileceği yani) Eğer Ancak şu

var rangePartitioner = Partitioner.Create(0, source.Length); 
    Parallel.ForEach(rangePartitioner, (range, loopState) => 
    { 
     // Loop over each range element without a delegate invocation. 
     for (int i = range.Item1; i < range.Item2; i++) 
     { 
      var item = source[i] 
      //Do work on item 
     } 
    }); 

do verebilecek bir şeydi ise System.Collections.Concurrent.Partitioner<TSource>'dan türetilen yeni bir sınıf oluşturarak özel bir bölümleyici. Bu konu SO cevabını kapsayacak kadar geniştir, ancak başlamanıza yardımcı olmak için this guide on the MSDN'a bir göz atabilirsiniz.

GÜNCELLEME: onlar veri tampon etmeyen bir Partitioner.Create aşırı eklendi .NET 4.5 itibariyle, bir almazsınız Bununla 1. bir dizi maksimum boyutu ile bir Özel bölümleme yapma aynı etkiye sahiptir Bir sıradaki yavaş öğelerin bir kısmıyla şanssız olsaydı, sıraya sokulmuş bir sürü iş olan tek bir iş parçacığı.

var partitoner = Partitioner.Create(source, EnumerablePartitionerOptions.NoBuffering); 
Parallel.ForEach(partitoner, item => 
{ 
    //Do work 
}