2009-11-19 88 views
1

我現在有一個應用程序,這是一個管道設計。在第一階段中,它將一些數據和文件讀入Stream。有一些中間階段可以處理數據流。然後有一個最後階段將流寫入某處。這一切都是連續發生的,一個階段完成,然後轉入下一個階段。C#流設計問題

這一切都工作得很好,但現在數據量開始變得相當大(潛在的數百GB)。所以我想我需要做點什麼來緩解這一點。我最初的想法就是我正在尋找一些反饋意見(作爲一名獨立開發人員,我沒有任何地方可以反彈這個想法)。

我正在考慮創建一個並行管道。從管道開始的對象將創建所有的階段,並在它自己的線程中踢掉每一個階段。當第一個階段的流量達到某個特定大小時,它會將該流量傳遞到下一個階段進行處理,並啓動一個新的流程繼續填充。這裏的想法是,最後階段將關閉流,因爲第一階段是建立一個新的階段,所以我的內存使用率將保持較低。

所以問題: 1)對這個設計的方向有什麼高層次的想法? 2)是否有一種更簡單的方法,您可以認爲這可能適用於此? 3)有沒有什麼東西可以重複使用(不是我必須購買的產品)?

感謝,

拾音

回答

1

生產者/消費者模式是一種很好的處理方式。而且微軟有新的Parallel Extensions這應該爲你提供大部分的基礎工作。看看Task對象。有一個預覽版可用於.NET 3.5/VS2008。

你的第一個任務應該從你的流中讀取數據塊,然後將它們傳遞給其他任務。然後,在邏輯上合適的中間有許多任務。較小的任務(通常)更好。唯一需要注意的是確保最後一項任務按照讀取的順序保存數據(因爲中間的所有任務可能以與它們開始的順序不同的順序完成)。

+0

的並行擴展看起來非常有前途。我想我可以爲每個階段創建一個任務,開始每個階段,並使用新的Concurrent Collection類在階段之間傳遞流。我真的不想使用VS 2010,我似乎無法再找到預覽版。我會繼續尋找。 – MikeD 2009-11-19 06:36:46

+0

預覽的下載鏈接如下,但MS似乎已經改變了他們的網站,鏈接不再工作:-( http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD -593D-4B3C-B055-694C50D2B0F3 – ligos 2009-11-22 06:19:28

0

對於你提出的設計,你會希望有producer/consumer problems閱讀,如果你還沒有一個好的。在這種情況下,你需要很好地理解如何使用信號量。

另一種可以嘗試的方法是創建多個相同的管道,每個管道都在一個單獨的線程中。這可能更容易編寫代碼,因爲它具有更少的線程間通信。但是,根據您的數據,您可能無法以這種方式將其拆分爲塊。

0

在每個階段,你是否讀取了整個數據塊,進行操作,然後將整個卡盤發送到下一個階段?

如果是這種情況,您正在使用「推送」技術,將整個數據塊推送到下一個階段。你是否能夠像使用「拉」技術一樣在莊園中更多地處理事物?每個階段都是一個流,當您從該流讀取數據時,它會通過調用讀取來從前一流中提取數據。當每個數據流都被讀取時,它會以小數位讀取前一個數據流,然後處理它並返回處理後的數據。目標流確定從前一個流中讀取多少個字節,並且您不必消耗大量內存。這就是BizTalk這樣的應用程序的工作原理。有一些關於BizTalk管道流如何工作的博客,我認爲它可能正是你想要的。

這裏有一個多部分博客文章,你可能會感興趣:

Part 1
Part 2
Part 3
Part 4
Part 5

+0

呃,爲什麼downvote?這個答案有什麼問題? – Jeremy 2009-12-21 22:08:43