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

时间:2013-05-31 13:32:15

标签: c# multithreading linq

我写了下面的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

2 个答案:

答案 0 :(得分:3)

以下代码段可以使用Parallel Tasks Library's 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.
    });

答案 1 :(得分: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

相关问题