c#:并行For的资源利用

本文关键字:资源 For 并行 | 更新日期: 2023-09-27 17:51:01

我正试图在Parallel For中做一个唯一的检查,以使过程更快。这能做我唯一的支票吗?

下面是我的代码:
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);
        }
    }
});

我不确定Parallel For如何工作,但我想确保!uniqueCheck.Contains(…)条件是否会按预期工作。

c#:并行For的资源利用

请评论这一点,并张贴任何代码,如果这将不能工作。

我使用Guids编写了一些测试代码。您希望使用Distinct()的原因是,它将使用Hashset而不是列表来跟踪惟一项。Hashset可能比你的uniqueCheck列表对于大的行数要快得多。

正如你在结果中看到的,如果你写guids.AsParallel,它比没有并行稍微快一些,但如果你写Select(....).AsParallel(),它会慢一些。下面是结果代码:

Edit:添加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