2011-03-17 58 views
5

我需要編寫一個需要處理存儲在數據庫中的大量數據(100 000條記錄)的c#服務(可以是Windows服務或控制檯應用程序)。 處理每條記錄也是一個相當複雜的操作。作爲處理的一部分,我需要執行大量插入更新。使用多線程處理大量數據

我們使用NHibernate作爲ORM。

一種方法是加載所有記錄並按順序處理它們......這可能會變得很慢。 我正在考慮多線程選項,並且正在考慮讓多線程同時處理記錄塊。

誰能給我,我應該如何處理這個..考慮到我使用NHibernate的,什麼都像死鎖等可能的陷阱

非常感謝一些指點。

+0

小無關的問題 - 您的問題並不是真正的'C#'問題,所以我可能會刪除該標記;自從你提到NHibernate,並且由於問題的性質,我可能會將它作爲標籤添加。如果你想傳達你在.NET中,添加一個.NET標籤。 – DuckMaestro 2011-03-17 05:08:35

+0

謝謝..要點:) – Sennin 2011-03-17 05:14:33

+0

你在哪裏存儲你處理的數據? 100,000個獨立的更新語句將會殺死你的數據庫。 – 2012-04-17 14:02:47

回答

0

聽起來像PLINQ是最好的解決方案(Chapter 5 in this article)。但是,由於每個計算對數據庫都有很大的影響,因此應該爲每個線程創建單獨的會話。

2

假設你正在使用.NET 4.0,您可以使用任務並行庫(如已經提到)做這樣的事情:

Parallel.ForEach(sourceCollection, item => Process(item)); 

你的源集合會的裝載記錄的IEnumerable。該庫將爲您處理所有內容:

將源集合分區,並根據系統環境在多個線程上調度工作。並行方法運行得越快,系統上的處理器就越多。

它可能有助於閱讀a tutorial on using Parallel.ForEach()。另外,請注意potential pitfalls

+0

感謝Jon和你們所有人的建議。我只是看着任務並行庫。我想知道如何在這裏管理NHibernate會話,因爲我無法控制並行線程。理想情況下,我希望每個並行線程都擁有自己的會話..關於如何用TPL完成任何想法? – Sennin 2011-03-17 05:58:25

0

如果可能,請使用IStatelessSessions,並使用adonet.batch_size屬性進行實驗。

它也需要如何高性能?我是NH的粉絲,但這是存儲過程可能更好的一種場景

+1

一如既往的高性能需求:)但是我並不太熱衷於將所有業務邏輯轉移到sproc – Sennin 2011-03-17 05:53:30