NutzCN Logo
问答 有个比较恼火的问题,希望能得到各位老大算法上的帮助,谢谢
发布于 2246天前 作者 wx_chrohf6r75suj7q2r8fh 1707 次浏览 复制 上一个帖子 下一个帖子
标签:

有一批来自设备的数据,每个设备的某些参数必须是唯一,使用这个设备的用户感知才会好。现在就是有些的数据不唯一,重复了,需要将重复的修改成唯一的值,所以需先按一定的规则排序,取一条数据,和下一条数据比对,如果一样,先调出空闲的数据值,取一个更新当前的数据,否则直接取取下一条,一直比对下去,老大们有其他的方法实现么?

31 回复

我现在就是按照这个思路在做,但UPDATE的时间很长,全局有近千万的数据量,每次我取40万处理,仅仅更新就要1个多小时,有其他算法吗?

考虑建一个唯一设备不包含需处理字段的表,在需处理的表中标记重复的数据。问题是,如果一个设备值被重复了3次,我只需修改2个,有个不需要改,因为修改的值也是有大小的,只能取一定范围内的值,超过了,就会取不到,怎么做?

不晓得是算法的问题,还是UPDATE本身就需要这么长的时间

一次取40w太多了, 一次1000还差不多

这个表有没有主键的?

如果有主键,按主键排序,然后逐个更新为顺序值就好了吧

取得的表是随机顺序的,需先按照某个规则排序,有ID和主键

一般按照BATCH更新,40W大概需要多长时间

实际不会有40W全部更新,会搜索到需改的数据,大概也就是1-2万

取1000不行,因为是来自一个系统,数据有关联

感觉FASTINSERT要比ADDBATCH的UPDATE快

取出有重复表的数据放在一个LIST中,删除原表的重复数据,修改LIST中需改的值,FASTINSERT回原表?不晓得会快些不

原来的方法需80多分钟

网站的SESSION都超时了

这是要迁移数据吧。后台跑线程就好了

走jdbc试试?

应该计时一下,分段计时,使用StopWatch,看看到底哪部分耗时,然后针对性改善

UPDATE 1000个,差不多4分钟

不对,现在写了一个较复杂的SQL语句,不存在大量的搜索了

直接把重复的挑出来了

update OLTVLAN.dbo.ztevlan set newc_vid=? where id=?

18-09-21 21:57:02.231 DEBUG [http-nio-8990-exec-85] update OLTVLAN.dbo.ztevlan set newc_vid=? where id=?
| 1 | 2 |
|----------|--------|
| 222 | 356017 |
| 3009 | 356814 |
| 3010 | 356849 |
| 3011 | 355454 |
| 3012 | 355484 |
| 3013 | 356887 |
| 3014 | 356190 |
| 3015 | 356563 |
| 3016 | 355796 |
| 3017 | 355995 |
-- Only display first 10 lines , don't show the remaining record(count=1001)
For example:> "update OLTVLAN.dbo.ztevlan set newc_vid='222 ' where id=356017"
18-09-21 22:00:56.295 DEBUG [http-nio-8990-exec-85] SELECT * FROM oltvlan.dbo.cvlanallgh WHERE cvlan not in (select rtrim(c_VID) from oltvlan.dbo.ztevlan where pon='1-3-5' and WYIP='134.180.112.19' and s_vid='2987' and gh='99') and cvlan like '3%' and len(cvlan)='4' and isdeal is null and gh='99' order by cvlan

18-09-21 21:57:02.231
18-09-21 22:00:56.295
差不多4分钟

老大,有使用jdbc的例子吗

dao.run(new SqlCallback(){
      ...
});

如何获dao的connection?

给错了, 应该是

dao.run(new ConnCallback(){
      ...
});

使用UPDATE的思路,一直耗时很长,后来改了:先按条件做唯一性排查,把表中存在为唯一性条件的数据取出,存为LIST,把表中存在的重复数据删除,更新LIST中相关记录,再FASTINSERT回原表,发现耗时只有原来的1/8,圆满解决

添加回复
请先登陆
回到顶部