1

我有一组数据全部翻倍:100 行 20 列

我将数据拉到一个 IEnumerable 列表中:

var RowsOfData = File.ReadLines(dll.Globals.OutputDir +     dll.Globals.filename).Select(a => a.Split(',').ToList());

var FilteredRowsToday = (from n in RowsOfData
       where n[1] == 1
       orderby n[0] descending
       select n);

然后我有一组函数,它们对每个数据行进行简单的检查,每个都返回一个 Bool。我想要的是计算每个函数评估为真的行数。然后,当我扩大项目规模时,如果可能的话,我希望尽快并行处理,我尝试过:

foreach (var row in FilteredRowsToday) {  
is f1() true, is f2() true 
etc
}

我尝试并行执行似乎很慢

foreach (var row in FilteredRowsToday.AsParallel())

没有更快

我现在在想这样的事情:

var TotalTrue = FilteredRowsToday.Select(item => f1() & f2() & f3()).Count();

如果这是一个更好的陈述点,我可以预处理数据以将每个函数的评估结果作为一种二进制网格提供?

F1, f2, f3 etc
1, 0, 0 row 1
1, 1, 1 row 2 etc

欢迎提出建议!

4

2 回答 2

1

如果您只对所有三个函数评估为真的计数感兴趣,那么这应该足够了:

var TotalTrue = FilteredRowsToday.Count(item => f1() & f2() & f3());

至于为什么它很慢,你的功能可能是这背后的原因。

您可以尝试只评估行,直到所有三个函数都返回 true,或者其中至少一个返回 false,例如

var TotalTrue = FilteredRowsToday.Count(item => f1() && f2() && f3());

即,如果f1()评估为false,则不必费心进行其余的验证。

更新:如果您的函数没有进行任何资源密集型检查,那么并行 LINQ 不会对您有多大好处(更多信息在这里)。

于 2012-11-06T20:43:46.640 回答
0

正如我所见,您正在一次读取文件,它是一种逗号分隔的文件。如果您在阅读时从文件中产生记录,它将允许您处理它们,直到您等待下一次阅读。

private IEnumerable<string> GetRecords(string fileName) {
    using (StreamReader reader = File.OpenText(fileName))
            {
                string line = reader.ReadLine();
                while (line != null)
                {   
                   yield return line.Split(',');
                   line = reader.ReadLine();
                 }
             }
}

您还花了一些时间将结果Split转换List为已经是 array并且具有执行查询所需的索引访问权限。

我还建议应用之前建议的优化,例如使用.Count(item => f1() & f2() & f3());而不是.Select(item => f1() & f2() & f3()).Count();.

尽管如此,我不相信这些优化中的任何一个都会用如此少量的数据带来任何改进。如果您发布有关处理部分代码的一些详细信息,我认为我们可以为您提供更好的帮助。

于 2012-11-06T22:33:15.057 回答