请问如何实现数据对比呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zx9481
V2EX    Java

请问如何实现数据对比呢?

  •  1
     
  •   zx9481 2022 年 5 月 31 日 2887 次点击
    这是一个创建于 1426 天前的主题,其中的信息可能已经有所发展或是发生改变。

    服务器中每天会上传一个 txt 格式的人员清单(应该每天就几万条),为了和数据库中的人员保持一致,需要按行逐一读取与数据库对比,比如数据重复,数据不存在等。。。 个人感觉逐一对比这种方式过于复杂,每读取一行就要遍历一次用户表数据,请问还有其他效率更高,更简单的方法处理吗?

    17 条回复    2022-05-31 22:59:34 +08:00
    renmu123
        1
    renmu123  
       2022 年 5 月 31 日 via Android
    都拿出来放到内存里来比
    zhangshaohan
        2
    zhangshaohan  
       2022 年 5 月 31 日
    数据库中数据不多的话,查关键字段到内存后,与 txt 取差集
    lybcyd
        3
    lybcyd  
       2022 年 5 月 31 日
    就几万条,量也不大,直接把数据库数据读成一个 k-v 的 map ,再把 txt 的数据读入一个 list ,直接检查 key 是否存在
    Joker123456789
        4
    Joker123456789  
       2022 年 5 月 31 日
    设置一个 唯一约束的字段,插入的时候报错 就说明存在了。
    zx9481
        5
    zx9481  
    OP
       2022 年 5 月 31 日
    @renmu123
    @Geekerstar
    @lybcyd
    内存处理确实没想到,谢谢大佬!
    Joker123456789
        6
    Joker123456789  
       022 年 5 月 31 日
    如果你只是想 过滤掉 存在的这条,也可以,用 on duplicate key update 就好了, 插入时发现唯一字段冲突了,就只做更新操作
    bxtx999
        7
    bxtx999  
       2022 年 5 月 31 日
    bloom filter
    F281M6Dh8DXpD1g2
        8
    F281M6Dh8DXpD1g2  
       2022 年 5 月 31 日   2
    几万条写到数据库里面一个 join 完事
    Macolor21
        9
    Macolor21  
       2022 年 5 月 31 日   1
    1. 先查询所有用户表 /关键数据到内存 1 次网络 I/O
    2. 放入 HashMap/ BloomFilter
    3. 再读取 txt 的所有数据,构建出 List 1 次文件 IO
    4. 遍历 list 比对数据

    因为几万条的数据量也不大,假设特别大了,就考虑用 io 来换内存空间了。
    lookStupiToForce
        10
    lookStupiToForce  
       2022 年 5 月 31 日
    "每读取一行就要遍历一次用户表的数据"
    不是,你数据库里那张表的 join_key 不建索引的吗,居然查一次就扫一次全表?
    建索引后 b+tree 匹配一条数据就只用查几次而已,树深度通常就 3 撑死了就 4 ,查几次由深度决定
    这样几万条记录进去 nested loop join 撑死也就查(几万*4)次而已,再慢再慢的 io 也就几秒钟,哪还用加上其他开发啊?除非你数据库非常繁忙,这几秒钟的 io 都要排队跟其他进程均分。
    aec4d
        11
    aec4d  
       2022 年 5 月 31 日
    数据库安装个 xxhash ,数据库和 csv 同时针对主键计算摘要
    https://jolynch.github.io/posts/use_fast_data_algorithms/
    ChoateYao
        12
    ChoateYao  
       2022 年 5 月 31 日
    你需要找出不一致的数据,那么循环的少不了,只要你把数据都取出来放内存里面的话,对比还是很快的。
    wowh
        13
    wowh  
       2022 年 5 月 31 日 via iPhone
    不知道是怎么对比如果有唯一匹配字段的话 ,可以建个索引,直接读取数据库也不慢。

    不方便修改数据库的话,也可以把数据库的数据都写到 redis 里,再匹配这样应该更快一些
    yazinnnn
        14
    yazinnnn  
       2022 年 5 月 31 日
    用 hashset 比较的话会很快吧
    luozic
        15
    luozic  
       2022 年 5 月 31 日
    有木有名称重复,没有直接用 Cuckoo Filter
    512357301
        16
    512357301  
       2022 年 5 月 31 日 via Android
    题主是 rd 吧,这种问题跟 dba 沟通下吧,这种数据量,这种逻辑对他们来说是小意思,你别乱来,否则得小心他提刀来见,哈哈哈。
    其实我觉得#8 楼 @liprais 的方法不错
    strawberryBug
        17
    strawberryBug  
       2022 年 5 月 31 日 via Android
    redis sdiff
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1751 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 78ms UTC 16:15 PVG 00:15 LAX 09:15 JFK 12:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86