最佳算法实现对泛型集合的数据去重
2023-09-14 09:06:28 时间
我负责运维的机票差旅分析报告项目, 分析报告所需的数据(订单数据和基础维度数据)是从业务库抽取过来的。 其中,有一个用户账户数据的同步程序, 今天查看线上日志,发现同步程序出现了异常:
执行ExecuteSqlCommand方法捕获到System.Data.SqlClient.SqlException异常:违反了 PRIMARY KEY 约束“PK_BASEUSERACCOUNT”。不能在对象“dbo.BaseUserAccount”中插入重复键。重复键值为 (105487)。 违反了 PRIMARY KEY 约束“PK_BASEUSERACCOUNT”。不能在对象“dbo.BaseUserAccount”中插入重复键。重复键值为 (105488)。 语句已终止。 语句已终止。,SQL: insert BaseUserAccount(AccountId,AccountName,LoginName,EntId,EntName,DeptId,DeptName,CreateTime) values(74188,'薛彦','薛彦',49261,'太极计算机股份有限公司-智慧城市SBU部门一',49265,'销售部','2016/1/19 16:11:23');insert BaseUserAccount(AccountId,AccountName,LoginName,EntId,EntName,DeptId,DeptName,CreateTime) values(74205,'徐琳','徐琳',49261,'太极计算机股份有限公司-智慧城市SBU部门一',49265,'销售部','2016/1/19 16:11
程序底层是用EF实现的,账户同步的逻辑是把数据从数据源读取过来放到一个List集合里,然后在本地系统持久化时,先清空表,再将List的数据转换后分批插入。 通过分析,是从数据源拿的数据里有重复的数据,导致这边插入时出现主键冲突。
数据源系统的数据存储比较乱,我们改变不了。只能在我们这边做文章了。 于是,决定的改进方案是:根据AccountId对集合数据去重。
我跟开发小组的一个同学说了一下,并叮嘱,从数据源获取到的记录有6万多条,注意优化一下去重算法。如果按常规的去重,估计要耗时5分钟,期望优化后能控制在半分钟内。
第二天,这个小同学交活了。 6万条记录的List集合,算法耗时平均不超过15毫秒。 赞一个!
他的实现方案是,利用List的Distinct方法,然后重写了实体类的Equals方法。如下上代码:
namespace EntOlap.ETL.EF { public partial class BaseUserAccount // 由于是EF,这里新建一个partial类 { public override bool Equals(object obj) { BaseUserAccount bua = obj as BaseUserAccount; if (bua == null) { return false; } else { return this.AccountId == bua.AccountId; } } public override int GetHashCode() { return AccountId.GetHashCode(); } } }
相关文章
- 算法题——枚举
- Java实现 蓝桥杯VIP 算法提高 复数求和
- Java实现 蓝桥杯VIP 算法训练 集合运算
- Java实现 蓝桥杯VIP 算法训练 王后传说
- (算法)求表达式(含括号)的值
- (算法)无向图最短路径的数目
- DL之MTCNN:MTCNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之DeepLabv1:DeepLabv1算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之RetinaNet:RetinaNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- ML之DT之CART:分类与回归树CART算法的简介、应用、经典案例之详细攻略
- DL之NIN:Network in Network算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之R-CNN:R-CNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之Xception:Xception算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- 基于免疫算法的认知无线电资源分配优化算法的matlab仿真
- 正弦余弦算法的樽海鞘群算法
- 数据结构与算法_17 _ 跳表:为什么Redis一定要用跳表来实现有序集合?
- 【基础知识】7、排序算法 C++ 程序
- Java中的六种经典比较排序算法:代码实现全解析
- 目标检测YOLOv7系列算法模型-论文详解