【问题标题】:Parallel execution of datarow comparison using custom comparison class使用自定义比较类并行执行数据行比较
【发布时间】:2012-06-20 10:23:44
【问题描述】:

我正在实现一个“协调”库,它允许在不同的数据对象之间执行差异。作为实现的一部分,我将要比较的对象(主要是 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,但希望所有比较并行发生,因为这些任务彼此独立,并且最后提供了执行逻辑与或逻辑或的可选性关于比较任务。

问题:

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

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

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

【问题讨论】:

  • 您到底想并行运行什么?每个Except() 是否应该并行化(正如您对使用自定义DataRowComparer 的建议所表明的那样)?还是您想并行运行此方法的多次调用(正如您提到使用 orand 所表明的那样)?
  • 我希望并行比较各个行。此方法的调用类型{logical_AND 或logical_OR} 将决定并行比较的行为。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多