2011-04-14 9 views
6

Senaryo: Veri, zaman damgalarıyla birlikte veritabanına yazılır ve yazılır. Ham verileri, zaman damgasına göre alınan sıraya göre işlemek ve veritabanına, farklı tabloya geri yazıp, zaman damgasını temel alarak siparişi sürdürmem gerekiyor.Paralel veri işlemede kullanılacak sıra türü - C# - .NET 4

Aşağıdaki tasarıma geldim: Biri veritabanından ham veri depolamak için, diğeri DB'ye yazılmadan önce işlenmiş verileri depolamak için iki tane kuyruk oluşturuldu. İki iş parçacığım var; biri İlk sırasına göre okuyor ve Sonuç kuyruğundan başka bir okuma yapıyorum. Aralarında ilk sıradaki verileri işlemek ve Sonuç kuyruğuna yazmak için birden fazla iş parçacığı üretiyorum.

SortedList (el ile kilitleme) ve BlockingCollection ile denemeler yaptım. Paralel olarak işlemek için iki yaklaşım kullandım: Parallel.For (ForEach) ve TaskFactory.Task.StartNew. Her bir birim veri, birkaç faktöre bağlı olarak işlemek için değişken bir süre alabilir. Bir iş parçacığı yine de ilk veri noktasını işleyebilirken, diğer iş parçacıkları her biri üç veya dört veri noktasıyla yapılır, zaman damgası sırasını karıştırır.

Son zamanlarda OrderingPartitioner hakkında bilgi edindim ve sorunun çözüleceğini düşündüm, ancak MSDNs örneğini izledikten sonra, alttaki koleksiyonu da ayırmadığını görebiliyorum. Karmaşık veri türleri koleksiyonumu sipariş etmek için özel bölümleyici kullanmam gerekebilir mi? veya problemi çözmenin daha iyi bir yolu olabilir mi?

Benzer sorunu tartışan makalelere yönelik herhangi bir öneri ve/veya bağlantı çok takdir edilmektedir.

+1

Bazı kodları ekleyebilir misiniz? – flesh

cevap

5

Şahsen, en azından giriş için BlockingCollection<T> ve sonuçlar için bir ConcurrentQueue<T> örneğini kullanarak başlamak çalışacaktı.

Sonuçları işlemek için Paralel Linq kullanırım. İşleminiz sırasında siparişi korumak için, PLINQ ifadesinde AsOrdered()'u kullanabilirsiniz.

+0

cevabı olarak işaretlemem gerekecek. Plinq üzerinde .AsParallel() yöntemi, öğelerin iş parçacığı için güvenli bir şekilde toplanmasını sağlar mı? Yoksa kendimi kilitlemeli miyim? – Dimitri

+0

@Dimitri: IEnumerable çağrılan AsParallel(), numaralandırmayı doğru olarak işleyecektir, ancak yine de verileri işlerken gereken herhangi bir iç kilitlemeyi kullanmanız gerekir. –

+0

Çok teşekkürler. Bunu bir deneyin vereceğim – Dimitri

0
Belki bunları kabul ettik

, ama ...

sadece tüm işlem parçacığı sonra veritabanında sipariş veritabanına zaman damgası geçmek ve sonra da izin veritabanı sıralama yapmak veya düzeltemez Neden

var iade? sql deyimlerinin sırayla yürütülmesi için var mı?

PLINQ harika ama iş parçacığı senkronizasyon gereksinimlerinden kaçınmaya çalışabilir ve eğer yapabiliyorsanız veritabanına daha fazla sipariş verisini iletirim.

+0

Seçimi kullanırken sql deyiminde siparişi kullanıyorum, ancak çıktı verileri DB'ye toplu ek kullanarak geri kopyalanamaz, her bir nokta tek tek ek olarak geri dönmeli ve kimlik daha fazla bilgi için uygulamaya geri döndürülmelidir işleme. SQL üzerinde stresi mümkün olduğunca en aza indirmeyi çok isterim – Dimitri