Aracılığıyla paylaş


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, örneğin foreach (For Each Visual Basic’te) bir döngüde kullanılacaksa, o zaman her iş parçacığının sonuçları tek bir sırada 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. İlk sonucunu vermeden önce gözle görülür bir süre çalıştırılabilir olan tam arabelleğe alınmış bir sorgu, tüketen iş parçacığının (aynı zamanda uygulama kullanıcısının) bakış açısından böyle algılanır. 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 olarak ForAll arabelleğe alınmaz. Tüm iş parçacıklarındaki tüm öğeleri hemen sunar.

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, bu seçenek sadece görmezden gelinir. Ç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.

Paralel Birleştirme Seçenekleri

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

    NotBuffered seçeneği, her işlenen öğenin, üretilir üretilmez her iş parçacığından geri döndürülmesini sağlar. Bu davranış, çıkışı "streaming" yapmaya benzetir. AsOrdered İşleç sorguda varsa, NotBuffered kaynak öğelerin sırasını korur. Kullanılabilir oldukları anda sonuç vermeye başlasa NotBuffered da, tüm sonuçları üretme süresi diğer birleştirme seçeneklerinden birini kullanmaktan daha uzun olabilir.

  • Auto Buffered

    AutoBuffered seçeneği, sorgunun elemanları bir arabelleğe toplamasını ve ardından arabellek içeriğini belirli aralıklarla tüketen iş parçacığına topluca iletmesine neden olur. Bu, NotBuffered'ün "akış" davranışını kullanmak yerine, kaynak verileri "öbekler" halinde sunmaya benzer. AutoBuffered, ilk öğeyi tüketen iş parçacığında kullanılabilir yapmak için NotBuffered'den daha 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

    Bu seçenek, 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ç kimse
Cast Hiç kimse
Concat Yalnızca Dizi veya Liste kaynağı olan sıralı olmayan sorgular.
DefaultIfEmpty Hiç kimse
OfType Hiç kimse
Reverse Yalnızca Dizi veya Liste kaynağı olan sıralı olmayan sorgular.
Select Hiç kimse
SelectMany Hiç kimse
Skip Hiç kimse
Take Hiç kimse
Where Hiç kimse

Diğer tüm PLINQ sorgu işleçleri, kullanıcı tarafından sağlanan birleştirme seçeneklerini yoksayabilir. Bazı sorgu işleçleri, örneğin Reverse ve OrderBy, tümü üretilip yeniden sıralanana kadar herhangi bir öğeyi veremez. Bu nedenle, gibi ParallelMergeOptionsbir işleç de içeren bir sorguda kullanıldığında, Reverse birleştirme davranışı, işleç sonuçlarını oluşturana kadar sorguya uygulanmaz.

Bazı operatörlerin birleştirme seçeneklerini işleme yeteneği, kaynak dizisinin türüne ve AsOrdered operatörünün sorguda daha önce kullanılıp kullanılmadığına bağlıdır. ForAll her zaman NotBuffered'dir; öğelerini hemen verir. OrderBy her zaman FullyBufferedolur; sonuç vermeden önce listenin tamamını sıralamalıdır.

Ayrıca bakınız