可以让LinQ语句运行多线程-使用更多的cpu内核

本文关键字:内核 cpu LinQ 语句 多线程 运行 | 更新日期: 2023-09-27 18:16:11

我写了下面的linq语句。但是由于排队太多,处理起来要花很多时间。我的cpu有8个核心,但由于运行单线程,只使用1个核心。

所以我想知道这最后的语句是否可以在多线程中运行?

        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

可以让LinQ语句运行多线程-使用更多的cpu内核

下面的代码片段可以使用并行任务库的 Parallel.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.
    });

在采用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