我正在实施一个“协调”库,它允许在不同的数据对象之间执行差异。作为实现的一部分,我将对象转换为比较(主要是CSV文件)到数据表,并执行特定的比较步骤,比较最后一个比较行中的实际值。
为了进行行比较,我使用下面的代码:
var rowsMissingInTrgt = rowsInTrgt.Except(rowsInSrc, DataRowComparer.Default);
var rowsMissingInSrc = rowsInSrc.Except(rowsInTrgt, DataRowComparer.Default);
return rowsMissingInSrc.Count() > 0 ? false :
rowsMissingInTrgt.Count() > 0 ? false :
true;
我不想使用默认的DataRowComparer,而是希望实现一个自定义的DataRowComparer,但是希望所有的比较并行发生,因为这些任务是相互独立的,并且最后提供了做logical_AND或logical_OR的可选性。关于比较任务。
实现“IEqualityComparer<TRow>where TRow : DataRow
”是否足以调用行的并行比较?
对于logical_AND,我认为,在第一个“假”上中止其余的比较是有意义的。可以这样做吗?
对于logical_OR,我需要类似于线程上的wait_All。如何实施?
答案 0 :(得分:0)
使用IEnumerable<T>.AsParallel()
作为源和目标集合。
DataTable sourceTable;
DataTable targetTable;
// run each collection as parallel.
var sourceRows = sourceTable.Rows.Cast<DataRow>().AsParallel();
var targetRows = targetTable.Rows.Cast<DataRow>().AsParallel();
var rowsMissingInTarget = sourceRows.Except(targetRows, DataRowComparer.Default);
var rowsMissingInSource = targetRows.Except(sourceRows, DataRowComparar.Default);
并行性适用于行集合,而不适用于比较本身。例如,在具有100k记录的表上,可以使用2个(或更多)线程完成处理,每个线程执行50k比较。 我建议你做一些性能测试。由于每行比较非常快,我怀疑在这种情况下并行处理行实际上会更慢。