使用自定义比较类并行执行数据行比较

时间:2012-06-20 10:23:44

标签: .net c#-4.0 linq-to-objects task-parallel-library parallel-extensions

我正在实施一个“协调”库,它允许在不同的数据对象之间执行差异。作为实现的一部分,我将对象转换为比较(主要是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的可选性。关于比较任务。

问题:

  1. 实现“IEqualityComparer<TRow>where TRow : DataRow”是否足以调用行的并行比较?

  2. 对于logical_AND,我认为,在第一个“假”上中止其余的比较是有意义的。可以这样做吗?

  3. 对于logical_OR,我需要类似于线程上的wait_All。如何实施?

1 个答案:

答案 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比较。 我建议你做一些性能测试。由于每行比较非常快,我怀疑在这种情况下并行处理行实际上会更慢。