2009-07-20 99 views
0

我目前正在研究解析大型XML文件的應用程序。並行化批處理應用程序

對於每個文件,都會有不同的進程,但所有進程都將被解析爲一個對象模型。

目前,從每個XML文件解析的對象將進入單個集合。

該集合也用於解析過程中,例如,如果一個類似的對象已經存在,它會修改對象的屬性,比如添加count。

看這個應用程序運行時的CPU圖形,很明顯它只使用了CPU的一部分(100%一次一個核心),所以我假設並行運行它將有助於縮短運行時間。

我是新來的並行編程,所以任何幫助表示讚賞。

+0

當你說這些XML文件將被解析爲單個對象模型時,是否意味着它們將被加載到內存中?如果是的話,那麼接下來要用這個對象模型做什麼?如果不對其執行某些操作/轉換並將其保存到其他地方,將內容加載到內存中很少有用。 – 2009-07-20 18:06:34

+0

@darin分析後會有額外的進程。但這不是這個問題的背景。 – 2009-07-20 18:08:28

回答

0

我建議你以下技術:構建等待處理的對象的隊列,並從多個線程出列,其中:

  1. 創建一個XmlReader,並開始通過節點讀取文件節點,而不是EOF。
  2. 一旦你遇到一個結束標記,你可以將它的內容序列化成一個對象。
  3. 將序列化的對象放入隊列中。
  4. 驗證隊列中的對象數量,如果它大於N,則從ThreadPool中踢出一個新線程,該線程將從隊列中取出< = N個對象並處理它們。

對隊列的訪問需要同步,因爲您將從多個線程入隊和出隊對象。

困難在於找到N使得所有CPU核心同時工作。

0

,而不是試圖管理線程自己(可以是一個艱鉅的任務),我建議使用並行庫。在.Net中查看PLINQ/TPL。 CTP可以下載here