2013-02-22 70 views
0

目前,我們的應用程序正在處理大量關於同一目錄中超過1000個XML文件的文件。這些文件全部被讀取,解析並更新/保存到數據庫。C#使用更少的CPU對進程進行多線程處理速度要快得多CPU

當我們在12核心機器上測試我們的應用程序時,整個過程比在4核心機器上處理它要慢得多。

我們觀察到的是,由我們的應用程序產生的線程數量達到30到90個線程的範圍,並且上下文切換開始大量增加。這可能是由許多並行執行引起的,但所有這些都很重要。

上下文切換是罪魁禍首嗎?或並行讀取/寫入文件?或者我們是否減少了並行任務的數量?

+0

你能發表一些代碼嗎? – 2013-02-22 10:04:36

+0

設計?你如何做你的線程間通信?你是否將整個文件讀入某個XML容器並將其排入處理池? – 2013-02-22 13:30:36

回答

1

瓶頸在這裏是磁盤訪問。無論啓動多少個線程,文件系統一次只能讀取一個文件。啓動更多線程只會讓他們爭奪這個單一資源,同時增加上下文切換和磁盤搜索時間。

在進程的另一端也是一個限制,因爲一次只有一個線程可以更新數據庫中的表,但數據庫被設計爲處理多個進程。

使單個線程負責磁盤讀取,一旦讀取了文件,它就可以啓動一個處理該文件的線程。這樣你可以以最有效的方式從磁盤讀取數據,並且在瓶頸後面有多線程操作部分。

+0

感謝Guffa的快速回答,但負責磁盤讀取的內容已經在單個線程中。儘管這對我們仍然有幫助。 – 2013-02-22 10:42:48