c# - 如何比较两个 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 条记录。如何在这里使用多线程概念来加快处理速度?
解决方案
在这里尝试的第一件事是在 上建立索引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);
}
});
但是,必须与数据库相关的代码不是简单可并行化的。
推荐阅读
- python - UFF 解析在语句 assert(parser.parse_buffer(stream, 0, network, model_datatype)) 的第 255 行失败
- reactjs -
没有重定向到所需的组件 - javascript - 如何将 JavaScript 对象属性设置为函数,例如 FileReader.onload?
- c++ - 使用内联静态类函数时出现未定义的类错误
- opengl - Rust 和 OpenGL 设置
- hibernate - @Entity类中的条件列在Hibernate中
- java - 获取带有 id 或 name 的 XML 节点
- spfx - 如何使用 sp.web SPFX 检索计算的列值
- java - 组件未能呈现
- python - 无法从数据库 Django 框架中获取图像