2010-11-19 14 views
0

Bu konudaki toplumun bakış açısını almak istiyorum. Büyük DB/IO bağlı bir işlemim varsa, Görev Paralel kitaplığını kullanarak bireysel işlem yollarını paralel hale getirmek ne kadar akıllı olur? Parallelization Considerations

  • bazı toplama işlemleri yapın ben öğelerin bir demet varsa

    ben ... Bir örnek kullanacağız ve ben öğelerin bir listesi için aşağıdaki işlemleri

    1. Sorgu bir DB yapmanız gereken Bazı öğeleri dinamik bir parametre listesine göre gruplandırmak.
    2. Gruplandırılmış her sonuç için, toplanan sonuca göre bir şey için veritabanını sorgulayın.
    3. Gruplandırılmış her sonuç için, bazı sayısal hesaplamaları yapın (sırayla 3 ve 4 olur).
    4. # hesaplanan sonuç için bazı ekler ve güncelleştirmeler Do 3
    5. her öğe için bazı ekler ve güncellemeleri # 1

    Mantıken konuşmak gerekirse, adım at # görevlerin bir grafiğin içine parallelize yapabilirsiniz iade etmeyin Bir öğe olarak 3, # 5, # 6, önceki sonucun üzerinde bir yatak yoktur. Ancak, bunların her biri veritabanında (sql server) bekleyecek ve bu da sadece SQL server'ın bize izin verdiği sürece işleyebileceğimizi anlıyoruz.

    Ancak, görevi yerel makineye mantıksal olarak dağıtmak istiyorum, böylece Veritabanı bizim kadar hızlı bir şekilde beklemek zorunda kalmadan işlem yapabilmemizi sağlıyor. Ben db aramaları Thread.Sleeps (Ben de bir milyon kez daha hızlı olan .SpinWait ile bazı varyasyonları denedim), ve paralel sürümü tamamen seri olan mevcut uygulamadan daha hızlı waaaaay ile yerine ben bazı sahte prototip yaptım ve hiç paralel değil.

    SQL sunucusuna çok fazla yük katmaktan korktuğum şey ... Bu yoldan çok aşağı gitmeden önce göz önünde bulundurmam gereken herhangi bir husus var mı?

  • cevap

    1

    başka bu görevlerin daha veritabanında doğrudan yapılmış olması gereklidir gibi geliyor değil Bu seçenek, birinci grup için 4. adım ile aynı anda gerçekleşen ikinci grup için 3. adımın bir boru hattı oluşturulması olacaktır. Ve güncellemeleri 5. adımda çakıştırabiliyorsanız, bunu da yapın. Bu sayede eşzamanlı SQL erişim ve işleme gerçekleştiriyorsunuz, ancak veritabanını aşırı vergilendirmiyorsunuz çünkü aynı anda yalnızca iki eşzamanlı işlem gerçekleştiriyorsunuz.

    Böylece, daha fazla işlem gerektiren gruplar topluluğu almak için sırayla (ve varsayalım) 1. ve 2. adımları uygularsınız. Sonra.ana iş parçacığı başlar:

    for each group 
        query the database 
        place the results of the query into the calc queue 
    

    İkinci iplik hizmetleri sonuçları kuyruğu:

    while not end of data 
        Dequeue result from calc queue 
        Do numeric calculations 
        place the results of the query into the update queue 
    

    Üçüncü iplik hizmetleri güncelleme kuyruğu:

    while not end of data 
        Dequeue result from update queue 
        Update database 
    

    System.Collections.Concurrent.BlockingCollection<T> için çok etkili bir kuyruk olduğunu bu tür bir şey.

    Burada güzel bir şey, SQL Server daha eşzamanlı işlemleri işleyebilirse, birden çok hesaplama iş parçacığı veya sorgu/güncelleştirme iş parçacığı ekleyerek isterseniz ölçeklendirilebiliyor olmanızdır.

    Günlük bir birleştirme/güncelleştirme programında buna çok benzer bir şey kullandığım çok iyi sonuçlarla. Bu süreç, SQL sunucusunu kullanmaz, daha ziyade standart dosya G/Ç'yi kullanır, ancak kavramlar çok iyi çeviri yapar.

    2

    Paralel sürüm, seri sürümden daha hızlıysa, SQL sunucunuzdaki zorlamadan endişelenmemeliyim ... tabi ki, gerçekleştirdiğiniz görevler, diğer önemli veya zaman açısından kritik öneme sahip olmadıkça düşük önceliklidir. DB sunucusunda da gerçekleştirilen işlemler.

    görevlerin Açıklamanız iyi tarafımdan anlaşılamamıştır ama neredeyse (bunu mümkün değildir yapmak detaylar vardır tahmin?)