2013-04-25 26 views
4

我正在使用PLINQ對數據進行並行操作。每個線程都會消耗大量的內存,這些內存是基於算法設置而變化的,所以根據算法選項預先計算需要多少內存並不容易。當內存要求較低時,最優的線程數爲8,系統總數爲8;當內存要求很高時,2個線程相對於1有顯着的改進,但是一旦使用了3個線程,系統就開始觸發分頁文件,並且CPU利用率下降到0,並且性能下降了數百倍。使用PLINQ對線程計數的內存使用限制

我希望能夠做的是讓PLINQ增量線程數量,同時監視內存負載,一旦系統耗盡可用的物理內存,請在最後一個線程上設置取消標記,以便它可以回滾其內存,允許其他線程以最佳方式執行。

有關如何從PLINQ中獲取此行爲的任何想法,還是必須完全使用我自己的?

+1

據我所知,PLINQ決定了前面的線程數量,並且在問題執行過程中保持不變。你不能做任何事情(除了通過調用'WithDegreeOfParallelism()'來改變這個常量)。如果您使用的是'Parallel.ForEach()',您可能會有更好的機會:使用自定義的'TaskScheduler'。 – svick 2013-04-25 23:18:44

回答

1

PLINQ使用TreadPool線程(默認TaskSchedulerTaskFactory),所以你可以使用ThreadPool.SetMaxThreads(#N, #Q)來控制根據您的應用程序的當前內存消耗線程數。

但是在我看來,內存消耗量是一個應用程序,也許應該重新設計並推送到另一個模塊(如數據庫 - 一個RDBMS或NoSQL數據庫 - 或一個緩存系統) - 只是一個建議。