2013-05-31 57 views
1

我已經寫了下面的linq語句。但是由於線路太多,處理需要很長的時間。我的CPU有8個內核,但由於運行單線程只使用1個內核。這個LinQ語句可以運行多線程 - 使用更多的cpu核心

所以我很想知道這個最終版本能夠在多線程中運行嗎?

 List<string> lstAllLines = File.ReadAllLines("AllLines.txt").ToList(); 
     List<string> lstBannedWords = File.ReadAllLines("allBaddWords.txt"). 
Select(s => s.ToLowerInvariant()). 
Distinct().ToList(); 

我在問下面的問題。該線可以工作多線程?

 List<string> lstFoundBannedWords = lstBannedWords.Where(s => lstAllLines. 
SelectMany(ls => ls.ToLowerInvariant().Split(' ')). 
Contains(s)). 
     Distinct().ToList(); 

C#5,netframework 4.5

+2

看着[PLINQ](http://msdn.microsoft.com/zh-cn/library/dd460688.aspx)?請注意,這無法保證讓任何事情都能更快運行。 –

+0

@AdamHouldsworth還沒有檢查,但讓我看看:) – MonsterMMORPG

+0

http://stackoverflow.com/questions/7582591/how-to-plinq-an-existing-linq-query-with-joins([瞭解加速在PLINQ中](http://msdn.microsoft.com/en-us/library/dd997399.aspx))查詢的代價越高,PLINQ的候選人就越好。 –

回答

3

下面的代碼片斷可以使用Parallel Tasks Library'sParallel.ForEach方法執行該操作。下面的代碼片段將你所擁有的'all-lines'文件中的每一行都分隔開,然後在每一行中搜索被禁止的單詞。 Parallel-ForEach應該使用機器處理器上的所有可用內核。希望這可以幫助。

System.Threading.Tasks.Parallel.ForEach(
    lstAllLines, 
    line => 
    { 
     var wordsInLine = line.ToLowerInvariant().Split(' '); 
     var bannedWords = lstBannedWords.All(bannedWord => wordsInLine.Contains(bannedWord)); 
     // TODO: Add the banned word(s) in the line to a master list of banned words found. 
    }); 
1

訴諸AsParallel

HashSet<string> lstAllLines = new HashSet<string>(
           File.ReadAllLines("AllLines.txt") 
            .SelectMany(ls => ls.ToLowerInvariant().Split(' '))); 

List<string> lstBannedWords = File.ReadAllLines("allBaddWords.txt") 
            .Select(s => s.ToLowerInvariant()) 
            .Distinct().ToList(); 

List<string> lstFoundBannedWords = lstBannedWords.Where(s => lstAllLines.Contains(s)) 
            .Distinct().ToList(); 

由於訪問HasSet是O(1)lstBannedWords越短名單,你甚至可能不是之前有房的性能改進需要任何並行性(TotalSearchTime=lstBannedWords.Count*O(1))。最後,你總是可以選擇AsParallel

+1

這不是我,但你可能想要將'lstAllLines'變量重命名爲'hashAllWords',以使代碼更易於理解。 – Dirk

+0

@Dirk我只想保留OP的變量名稱。畢竟,使用VS只是重構/重命名。 – I4V

+0

其實這不完全是我在做什麼:)也我沒有投票。我正在逐字檢查,你正在檢查文字級別。 – MonsterMMORPG