.net plinq选择所有函数计算为真的计数
我有一套全双倍的数据: 100行20列 我正在将数据拉入IEnumerable列表,其中包含:.net plinq选择所有函数计算为真的计数,.net,plinq,.net,Plinq,我有一套全双倍的数据: 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 orde
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。
我想要的是计算每个函数为true的行数。
然后,当我扩大我的项目规模时,如果可能的话,我希望尽快并行处理该项目,我已经尝试:
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
欢迎您的建议 如果您只对三个函数的计算结果都为true的计数感兴趣,那么这就足够了:
var TotalTrue = FilteredRowsToday.Count(item => f1() & f2() & f3());
至于它为什么慢,你的功能可能是背后的原因
您可以尝试只计算行,直到所有三个函数都返回true,或者至少其中一个函数返回false,例如
var TotalTrue = FilteredRowsToday.Count(item => f1() && f2() && f3());
也就是说,如果f1()
的计算结果为false
,则不必费心进行其余的验证
更新:如果您的函数没有执行任何资源密集型检查,那么并行LINQ对您没有多大好处(更多信息)。如果您只对三个函数的计算结果都为真的计数感兴趣,那么这应该足够了:
var TotalTrue = FilteredRowsToday.Count(item => f1() & f2() & f3());
至于它为什么慢,你的功能可能是背后的原因
您可以尝试只计算行,直到所有三个函数都返回true,或者至少其中一个函数返回false,例如
var TotalTrue = FilteredRowsToday.Count(item => f1() && f2() && f3());
也就是说,如果f1()
的计算结果为false
,则不必费心进行其余的验证
更新:如果您的函数没有执行任何资源密集型检查,那么并行LINQ对您没有多大好处(更多信息)。正如我看到的,您正在立即读取文件,它是一种逗号分隔的文件。 如果您在读取时从文件中产生记录,它将允许您处理这些记录,直到等待下一次读取
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();
}
}
}
private IEnumerable GetRecords(字符串文件名){
使用(StreamReader=File.OpenText(文件名))
{
字符串行=reader.ReadLine();
while(行!=null)
{
收益率回归线.分割(',');
line=reader.ReadLine();
}
}
}
您还需要花费一些时间将Split
的结果转换为List
,该列表已经是数组,并且具有执行查询所需的索引访问权限
我还建议应用之前建议的优化,比如使用.Count(item=>f1()&f2()&f3())代码>而不是。选择(项=>f1()&f2()&f3()).Count()代码>
尽管如此,我不相信这些优化会在如此少量的数据下带来任何改进。我认为,如果您发布一些关于您处理代码部分的详细信息,我们可以更好地帮助您。因为我看到您正在立即读取文件,它是一种逗号分隔的文件。
如果您在读取时从文件中产生记录,它将允许您处理这些记录,直到等待下一次读取
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();
}
}
}
private IEnumerable GetRecords(字符串文件名){
使用(StreamReader=File.OpenText(文件名))
{
字符串行=reader.ReadLine();
while(行!=null)
{
收益率回归线.分割(',');
line=reader.ReadLine();
}
}
}
您还需要花费一些时间将Split
的结果转换为List
,该列表已经是数组,并且具有执行查询所需的索引访问权限
我还建议应用之前建议的优化,比如使用.Count(item=>f1()&f2()&f3())代码>而不是。选择(项=>f1()&f2()&f3()).Count()代码>
尽管如此,我不相信这些优化会在如此少量的数据下带来任何改进。我认为,如果您发布一些关于处理代码部分的详细信息,我们可以更好地帮助您。100行是一个非常小的数目。你的计算为什么这么慢?有些方法需要很长时间吗?100行是一个很小的数目。你的计算为什么这么慢?有些方法需要很长时间吗?Tobias等人,非常感谢,我确实有一个列表来检查每个函数的返回,我是这样检查的:bool AllConditionsTrue=conditions.TrueForAll(o=>o);这很好,但我也喜欢你上面的。关于每个函数计算的相对费用:早期,有些函数非常简单,有些函数更复杂,这就是为什么我可以先对函数进行预处理,然后将二进制网格类型结构的结果作为一个单独的过程进行计数。@user1796185:如果大部分处理时间都花在预处理上,那么预处理不会加快处理速度。计算结果不是问题。我的建议是关注您的评估方法,看看您可以在哪里优化它们。您甚至可以在检查结果时按复杂性顺序对其进行评估,从而确保先运行便宜(快速)的方法,如果其他方法的评估结果为true
,则只运行更密集的方法。Tobias等人,非常感谢,我确实有一个列表来检查以这种方式检查的每个函数的返回:bool AllConditionsTrue=conditions.TrueForAll(o=>o);这很好,但我也喜欢你上面的。至于每个函数计算的相对费用:早期,有些函数非常简单,而另一些更复杂,这就是为什么我可以先对函数进行预处理,然后将二进制网格类型结构的结果计算为