当前位置:首页 >娱乐 >两组数据量相对大时,如何高效进行比对 两组数据量相对大时

两组数据量相对大时,如何高效进行比对 两组数据量相对大时

2024-06-28 15:04:22 [百科] 来源:避面尹邢网

两组数据量相对大时,两组量相如何高效进行比对

作者:linyb极客之路 大数据 新闻 这三种方案,数据时何两层循环效率是高效最低,而且随着数据量增大会有OOM的进行风险。

01 前言

前阵子项目因业务需要,比对要对接兄弟部门的两组量相用户数据,因为兄弟部门并不提供增量用户数据接口,数据时何每次只能从兄弟部门那边同步全量用户数据。高效全量的进行用户数据大概有几万条。因为是比对全量数据,因此我们这边要做数据比对( 注:  用户username是两组量相唯一),如果同步过来的数据时何数据,我们这边没有,高效就要做插入操作,进行如果我们这边已经有,比对就要做更新操作。本文就来聊聊当数据量相对大时,如何进行对比

02 比对逻辑

因用户username是唯一的,因此我们可以利用用户username来进行比对匹配

两组数据量相对大时,如何高效进行比对 两组数据量相对大时

03 比对实现

1.方案一:两层嵌套循环比对

两组数据量相对大时,如何高效进行比对 两组数据量相对大时

即:将接口的全量数据和我们数据库的全量数据进行循环比对

两组数据量相对大时,如何高效进行比对 两组数据量相对大时

示例

@Override
public void compareAndSave(List<User> users, List<MockUser> mockUsers) {
List<User> addUsers = new ArrayList<>();
List<User> updateUsers = new ArrayList<>();
for (MockUser mockUser : mockUsers) {
for (User user : users) {
if(mockUser.getUsername().equals(user.getUsername())){
int id = user.getId();
BeanUtils.copyProperties(mockUser,user);
user.setId(id);
updateUsers.add(user);
}else{
User newUser = new User();
BeanUtils.copyProperties(mockUser,newUser);
addUsers.add(newUser);
}
}
}

}

用这种方法,我在测试环境压了30万条数据,比对数据等了大概20分钟后,直接OOM

2.方案二:使用布隆过滤器

即:比对开始前,先将我们这边的数据压入布隆过滤器,然后通过布隆过滤器来判定接口数据

示例

@Override
public void compareAndSave(List<User> users,List<MockUser> mockUsers){
List<User> addUsers = new ArrayList<>();
List<User> updateUsers = new ArrayList<>();
BloomFilter<String> bloomFilter = getUserNameBloomFilter(users);
for (MockUser mockUser : mockUsers) {
boolean isExist = bloomFilter.mightContain(mockUser.getUsername());
//更新
if(isExist){
User user = originUserMap.get(mockUser.getUsername());
int id = user.getId();
BeanUtils.copyProperties(mockUser,user);
user.setId(id);
updateUsers.add(user);
}else{
User user = new User();
BeanUtils.copyProperties(mockUser,user);
addUsers.add(user);
}
}

}

用这种方法,我在测试环境压了30万条数据,比对耗时1秒左右

3.方案三:使用list + map比对

即:比对开始前,先将我们这边数据存放到map中,map的key为username,value为用户数据,然后遍历接口数据,进行比对

示例

@Override
public void compareAndSave(List<User> users, List<MockUser> mockUsers) {
Map<String,User> originUserMap = getOriginUserMap(users);
List<User> addUsers = new ArrayList<>();
List<User> updateUsers = new ArrayList<>();
for (MockUser mockUser : mockUsers) {
if(originUserMap.containsKey(mockUser.getUsername())){
User user = originUserMap.get(mockUser.getUsername());
int id = user.getId();
BeanUtils.copyProperties(mockUser,user);
user.setId(id);
updateUsers.add(user);
}else{
User user = new User();
BeanUtils.copyProperties(mockUser,user);
addUsers.add(user);
}
}
}

用这种方法,我在测试环境压了30万条数据,比对耗时350毫秒左右

04 总结

这三种方案,两层循环效率是最低,而且随着数据量增大会有OOM的风险。采用布隆过滤器,存在误判的风险,为了降低误判风险,只能降低误判率,可以通过参数指定,但这也增加判断时间。用map可以说是效率最好,他本质是将时间复杂度从O(n2)降低到O(n)。不过这种方案可能也不是最优方案,事后和朋友讨论下,他说可以用啥双向指针啥,因为我在算法这方面没有深入研究,因此本文就没演示了

05 demo链接

https://github.com/lyb-geek/springboot-learning/tree/master/springboot-comparedata。

责任编辑:张燕妮 来源: Linyb极客之路 数据高效

(责任编辑:时尚)

    推荐文章
    • 为什么借呗变成信用贷后借不出来了 金融机构无法正常放款了吗?

      为什么借呗变成信用贷后借不出来了 金融机构无法正常放款了吗?借呗变成信用贷后,虽然服务主体变了,但只要还有额度就可以去借款的。可是有不少人表示借呗变成信用贷后借不出来了,那么这是什么原因导致的,需要怎么解决呢?这里就给大家来简单介绍下,一起看看吧。为什么借呗变 ...[详细]
    • 泰勒·斯威夫特照片被滥用,生成式AI让Deepfake变得廉价且简单

      泰勒·斯威夫特照片被滥用,生成式AI让Deepfake变得廉价且简单来源:DeepTech深科技嗨,泰勒·斯威夫特Taylor Swift),我们对最近发生在你身上的事情感到遗憾。看到 X 平台上传播的那些关于你的深度伪造色情内容,我能想象到你的心情,恶心、苦恼,甚至 ...[详细]
    • 蚕桑互作新机制揭示

      蚕桑互作新机制揭示【研究进展】    科技日报讯 记者雍黎)家蚕的生长发育与桑叶有关。1月29日,记者从西南大学获悉,该校何宁佳教授团队日前首次证明了桑树源微小核糖核酸miR168a可跨界调控家蚕生长发育,揭示了蚕桑互 ...[详细]
    • 探明桑寄生植物虫食强度受何影响

      探明桑寄生植物虫食强度受何影响报喜斑粉蝶幼虫取食桑寄生科植物。本报讯记者胡珉琦)植物被食草动物取食的强度常常受到邻居植物的影响,这被称为“关联效应”。然而,关联效应如何通过寄主影响其寄生植物,却鲜有研究。近日,中国科学院西双版纳热 ...[详细]
    • 皇朝家居(01198.HK)发布公告:年度归母净利同比下降89.2%

      皇朝家居(01198.HK)发布公告:年度归母净利同比下降89.2%皇朝家居(01198.HK)发布公告,截至2021年12月31日止年度,实现收入15.27亿港元,同比增长5.75%;母公司拥有人应占溢利7689.7万港元,同比下降89.2%;基本每股盈利2.999 ...[详细]
    • 国内大模型与GPT

      国内大模型与GPT1月30日,上海人工智能实验室发布了大模型开源开放评测体系司南OpenCompass2.0),同时在对部分主流大模型评测诊断的基础上,揭晓了年度大模型评测榜单,提到了国内大模型的优势与短板。根据评测, ...[详细]
    • 龙年氛围渐浓 到正佳感受大唐古韵

      龙年氛围渐浓 到正佳感受大唐古韵龙年氛围渐浓,广州众多商家、景区纷纷推出各种龙年主题活动。打造8大盛唐千灯唯美场景、美人鱼演绎震撼海底龙凤大秀、16种共1300余场精彩演出轮番上演……龙年新春将至,正佳文旅将为本地市民和来粤过年的游 ...[详细]
    • 探明桑寄生植物虫食强度受何影响

      探明桑寄生植物虫食强度受何影响报喜斑粉蝶幼虫取食桑寄生科植物。本报讯记者胡珉琦)植物被食草动物取食的强度常常受到邻居植物的影响,这被称为“关联效应”。然而,关联效应如何通过寄主影响其寄生植物,却鲜有研究。近日,中国科学院西双版纳热 ...[详细]
    • 小赢卡贷上征信吗 小赢卡贷迟一天会不会影响征信?

      小赢卡贷上征信吗 小赢卡贷迟一天会不会影响征信?在众多小贷平台中,不少借款人都选择了小赢卡贷这款借贷APP。小赢卡贷针对不同需求的人提供的贷款服务有信用卡代还、精英贷、小赢易贷这三类产品。小赢卡贷上征信吗?小赢卡贷迟一天还有事吗?一起来跟希财君了解 ...[详细]
    • 默默付出 做好东西部协作各项工作服务

      默默付出 做好东西部协作各项工作服务广东省中山市派驻贵州省六盘水市工作组组员范超:不同于在前方亲身参与推动各项工作具体落实的“扶友”,虽同处东西部协作“一线”,广东省中山市派驻贵州省六盘水市工作组组员范超更多时候是在幕后发挥参谋助手、桥 ...[详细]
    热点阅读