PLINQ'te Birleştirme Seçenekleri
Bir sorgu paralel olarak yürütülürken PLINQ, birden çok iş parçacığının genellikle ayrı iş parçacıklarında aynı anda farklı parçalar üzerinde çalışabilmesi için kaynak diziyi bölümler. Sonuçlar bir iş parçacığında (Visual Basic'te) bir döngüde kullanılacaksa, her iş parçacığının sonuçları tek bir foreach
For Each
sırayla birleştirilmelidir. PLINQ'un gerçekleştirdiği birleştirme türü, sorguda bulunan işleçlere bağlıdır. Örneğin, sonuçlara yeni bir sıra uygulayan işleçler tüm iş parçacıklarındaki tüm öğeleri arabelleğe almalıdır. Tüketen iş parçacığının (aynı zamanda uygulama kullanıcısınınkidir) perspektifinden bakıldığında, tam arabelleğe alınan bir sorgu, ilk sonucunu vermeden önce fark edilebilir bir süre çalıştırılabilir. Varsayılan olarak diğer işleçler kısmen arabelleğe alınıyor; sonuçları toplu olarak verir. Bir işleç varsayılan ForAll olarak arabelleğe alınmaz. Tüm iş parçacıklarındaki tüm öğeleri hemen verir.
Aşağıdaki örnekte gösterildiği gibi yöntemini kullanarak WithMergeOptions PLINQ'a ne tür bir birleştirme gerçekleştirildiğini gösteren bir ipucu sağlayabilirsiniz.
var scanLines = from n in nums.AsParallel()
.WithMergeOptions(ParallelMergeOptions.NotBuffered)
where n % 2 == 0
select ExpensiveFunc(n);
Dim scanlines = From n In nums.AsParallel().WithMergeOptions(ParallelMergeOptions.NotBuffered)
Where n Mod 2 = 0
Select ExpensiveFunc(n)
Örneğin tamamı için bkz . Nasıl yapılır: PLINQ'ta Birleştirme Seçeneklerini Belirtme.
Belirli bir sorgu istenen seçeneği desteklemiyorsa, seçenek yalnızca yoksayılır. Çoğu durumda, PLINQ sorgusu için birleştirme seçeneği belirtmeniz gerekmez. Ancak bazı durumlarda, sorguların varsayılan olmayan modda en iyi şekilde yürütüldüğünü test ederek ve ölçerek bulabilirsiniz. Bu seçeneğin yaygın kullanımlarından biri, daha hızlı yanıt veren bir kullanıcı arabirimi sağlamak için öbek birleştirme işlecini sonuçlarını akışa almak için zorlamaktır.
ParallelMergeOptions
Numaralandırma, ParallelMergeOptions desteklenen sorgu şekilleri için sonuçlar bir iş parçacığında kullanıldığında sorgunun son çıkışının nasıl verileceğini belirten aşağıdaki seçenekleri içerir:
Not Buffered
seçeneği, NotBuffered işlenen her öğenin, oluşturulur üretilmeye başlamaz her iş parçacığından döndürülür. Bu davranış, çıkışı "akışa" benzetir. AsOrdered İşleç sorguda varsa,
NotBuffered
kaynak öğelerin sırasını korur. Kullanılabilir oldukları anda sonuç vermeye başlasaNotBuffered
da, tüm sonuçları üretme süresi diğer birleştirme seçeneklerinden birini kullanmaktan daha uzun olabilir.Auto Buffered
seçeneği AutoBuffered , sorgunun bir arabelleğe öğe toplamasına ve ardından arabellek içeriğinin tümünü bir kerede tüketen iş parçacığına düzenli aralıklarla döndürmesine neden olur. Bu, kaynak verileri "akış" davranışını
NotBuffered
kullanmak yerine "öbekler" içinde vermeye benzer.AutoBuffered
, ilk öğenin tüketen iş parçacığında kullanılabilir duruma getirmekten dahaNotBuffered
uzun sürebilir. Arabelleğin boyutu ve tam verim davranışı yapılandırılamaz ve sorguyla ilgili çeşitli faktörlere bağlı olarak değişebilir.FullyBuffered
seçeneği, FullyBuffered öğelerden herhangi biri getirilmeden önce sorgunun tamamının çıktısının arabelleğe alınmasına neden olur. Bu seçeneği kullandığınızda, ilk öğenin tüketen iş parçacığında kullanılabilir olması daha uzun sürebilir, ancak tüm sonuçlar diğer seçenekler kullanılarak elde edilenden daha hızlı üretilebilir.
Birleştirme Seçeneklerini Destekleyen Sorgu İşleçleri
Aşağıdaki tabloda, belirtilen kısıtlamalara tabi olarak tüm birleştirme seçeneği modlarını destekleyen işleçler listelenmiştir.
Operatör | Kısıtlamalar |
---|---|
AsEnumerable | Hiçbiri |
Cast | Hiçbiri |
Concat | Yalnızca Dizi veya Liste kaynağı olan sıralı olmayan sorgular. |
DefaultIfEmpty | Hiçbiri |
OfType | Hiçbiri |
Reverse | Yalnızca Dizi veya Liste kaynağı olan sıralı olmayan sorgular. |
Select | Hiçbiri |
SelectMany | None |
Skip | None |
Take | None |
Where | Hiçbiri |
Diğer tüm PLINQ sorgu işleçleri, kullanıcı tarafından sağlanan birleştirme seçeneklerini yoksayabilir. Örneğin ve OrderBygibi bazı sorgu işleçleri, Reverse tümü üretilip yeniden sıralanana kadar herhangi bir öğeyi veremez. Bu nedenle, gibi Reversebir işleç de içeren bir sorguda kullanıldığında, ParallelMergeOptions birleştirme davranışı, işleç sonuçlarını oluşturana kadar sorguya uygulanmaz.
Bazı işleçlerin birleştirme seçeneklerini işleçleri, kaynak dizisinin türüne ve işlecin sorguda daha önce kullanılıp kullanılmadığına AsOrdered bağlıdır. ForAll her zamandır NotBuffered ; öğelerini hemen verir. OrderBy her zaman FullyBufferedolur; sonuç vermeden önce listenin tamamını sıralamalıdır.