2015-05-28 80 views
0

我正在嘗試在並行版本中執行唯一檢查,以使此過程更快。這實際上會做我獨特的檢查嗎?C#:並行資源利用率

以下是我的代碼:

List<string> uniqueCheck = new List<string>(); 

Parallel.For(1, Rows.Length, i => { 
    if (Rows[i].Length != 0) 
    { 
     string[] item = Rows[i].Split(delimiter.ToCharArray()); 

     if (!uniqueCheck.Contains(item[0].ToLower().Trim())) 
     { 
      uniqueCheck.Add(item[0].ToLower().Trim()); 
      dtUnqiueRows.Rows.Add(item); 
     } 
    } 
}); 

我不知道如何並行For的作品,但我想確認是否如預期或不uniqueCheck.Contains(...)條件將工作! 。

請對此發表評論併發布任何代碼可能不會工作。

+0

這是多少行?我不太確定在這個用例中使用Parallel.For會更快。 – mortb

+0

有1.6百萬行。 –

+0

您可以試試這個: 'var delimiters = delimiter.ToCharArray();' 'var dtUnqiueRows = Rows.Select(row => row.Split(delimiters)[0] .Trim()。ToLower())。AsParallel ().Distinct())。ToList();' – mortb

回答

1

我用Guids做了一些測試代碼。 您要使用Distinct()的原因是它將使用Hashset而不是列表來跟蹤唯一項目。 對於較大的行數,Hashset可能比您的uniqueCheck列表快得多。

正如您在結果中看到的那樣,如果您編寫guids.AsParallel,但比編寫Select(....).AsParallel()時要慢, 下面是結果代碼:

編輯:添加Select(... regex..)營造一個更「鍵重複」

var guids = Enumerable.Range(1, 1600000).Select(_ => Guid.NewGuid().ToString().ToUpper()).ToList(); 
guids = guids.Select(g => Regex.Replace(g, @"^([0-9A-F])[^\-]+", "$1$1$1$1")).ToList(); 
var delimiters = "-".ToCharArray(); 
    var delimiters = "-".ToCharArray(); 

var w = Stopwatch.StartNew(); 
var x = guids.Select(guid => guid.Split(delimiters)[0].ToLower()).Distinct().ToList(); 
Console.WriteLine(w.Elapsed); // 1.80 seconds 

w = Stopwatch.StartNew(); 
var y = guids.Select(guid => guid.Split(delimiters)[0].ToLower()).AsParallel().Distinct().ToList(); 
Console.WriteLine(w.Elapsed); // 1.67 seconds 

w = Stopwatch.StartNew(); 
var z = guids.AsParallel().Select(guid => guid.Split(delimiters)[0].ToLower()).Distinct().ToList(); 
Console.WriteLine(w.Elapsed); // 0.75 seconds 

編輯列表:這裏是與選擇第一行的解決方案獨特密鑰

// for selecting the first row which has unique "key" 

var w = Stopwatch.StartNew(); 
var a = guids.GroupBy(guid => guid.Split(delimiters)[0].ToLower()).Select(grp => grp.First()).ToList(); 
Console.WriteLine(w.Elapsed); // 0.65 seconds 

w = Stopwatch.StartNew(); 
var b = guids.AsParallel().GroupBy(guid => guid.Split(delimiters)[0].ToLower()).Select(grp => grp.First()).ToList(); 
Console.WriteLine(w.Elapsed); // 0.83 seconds 
+0

從上面給出的例子可以看出,我只是得到了拆分guid的第一個元素。我想要在完成獨特檢查後根據給定的分隔符將整個guid分割成一個數組。我怎麼做..? –

+0

我添加了兩個GroupBy語句,它們將爲每個唯一的「鍵」選擇第一個「全部」guid。我想這就是你想要的。我還使用正則表達式調整了guid列表,以便guid列表將包含許多重複鍵。 – mortb

+0

感謝您的解決方案。我很感激。 –