首页 > 解决方案 > 如何比较两个 DataTable 并使用多个线程更新第一个 DataTable?

问题描述

表 1 中有 150,000 条记录,我必须将表 1 中的每条记录与表 2 中的相应记录一一进行比较,如果找到匹配,则更新表 1 中的同一记录,如果未找到匹配,则需要更新表中的Notes列值表 1 未找到匹配记录。

为此,我分别从两个表中获取dt记录dt1

以下是我完成的代码

DataTable dt = getRecordsfromTable1();
DataTable dt1 = getRecordsfromTable2();
foreach(DataRow dr in dt.Rows)
{
     foreach(DataRow dr1 in dt1.Rows)
     {
          if(dr["Id"].ToString() == dr1["Id"].ToString())
          {
               //Calling update method in Data Access Layer to Update record in First table
               Update(dr["Id"].ToString());
          }
          else
         {
             //Id not found
         }
     }
}

但这工作非常缓慢,因为我正在逐一比较 150,000 条记录。如何在这里使用多线程概念来加快处理速度?

标签: c#multithreadingdatatableconsole-applicationmultitasking

解决方案


在这里尝试的第一件事是在 上建立索引Id,即

Dictionary<string, DataRow> lookup = new();
// index dt1
foreach(DataRow dr1 in dt1.Rows)
{
    var id = dr1["Id"].ToString();
    lookup.Add(id, dr1);
}
// now enumerate dt
foreach(DataRow dr in dt.Rows)
{
    var id = dr["Id"].ToString();
    if (lookup.TryGetValue(id, out var dr1))
    {
        //Calling update method in Data Access Layer to Update record in First table
        Update(id);
    }
}

注意:如果dr1实际不需要Update,您也可以Dictionary<string, DataRow>仅用HashSet<string>已知 id 替换 。

至于并行化它:这在很大程度上取决于做什么Update;并行化可能有用也可能没用。很高兴讨论更多,但是:需要看到它。如果它可以简单地并行化,那么简单地使用可能就足够了:

// now enumerate dt concurrently
Parallel.ForEach(dt.AsEnumerable(), dr =>
{
    var id = dr["Id"].ToString();
    if (lookup.TryGetValue(id, out var dr1))
    {
        //Calling update method in Data Access Layer to Update record in First table
        Update(id);
    }
});

但是,必须与数据库相关的代码不是简单可并行化的。


推荐阅读