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