对约 35g 的数据去重 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fields
V2EX    问与答

对约 35g 的数据去重

  •  
  •   fields 2020-02-04 10:23:01 +08:00 4895 次点击
    这是一个创建于 2081 天前的主题,其中的信息可能已经有所发展或是发生改变。
    数据占了 35g 左右存储,有标识每条数据的 id,还剩大约 7g 空闲空间,需要对这 35g 的数据去重,内存是 8g 的.如何对数据进行去重?
    34 条回复    2020-02-05 09:44:08 +08:00
    alalida
        1
    alalida  
       2020-02-04 10:33:49 +08:00 via Android
    你先想一想目标时间复杂度和空间复杂度。去重意味要查找,那最好也就对数时间复杂度。此外要看能否分批处理,数据有无规律。可以分批处理也会快很多。总之要先看数据长什么样。
    otakustay
        2
    otakustay  
       2020-02-04 10:36:13 +08:00
    数据是 35G,其中 id 部分有多大?不大的话哈希应该是有办法建起来的……
    shuangyeying
        3
    shuangyeying  
       2020-02-04 10:39:03 +08:00
    是裤子么?
    opengps
        4
    opengps  
       2020-02-04 10:39:44 +08:00
    去重字段仅仅是 id 字段?还是全字段匹配?
    malusama
        5
    malusama  
       2020-02-04 10:44:37 +08:00
    bloomfilter 有误差率
    fields
        6
    fields  
    OP
       2020-02-04 10:50:10 +08:00
    @opengps 每个 id 字段标识这条数据
    fields
        7
    fields  
    OP
       2020-02-04 10:50:23 +08:00
    @shuangyeying 不是的,亲
    fields
        8
    fields  
    OP
       2020-02-04 10:51:43 +08:00
    @alalida 在用分片,时间换空间,但很慢,每次 10w 条
    fields
        9
    fields  
    OP
       2020-02-04 10:52:31 +08:00
    @malusama 有空间限制的
    fields
        10
    fields  
    OP
       2020-02-04 10:53:41 +08:00
    @alalida 经过分析,每条数据里边的 id 唯一标识这条数据
    wysnylc
        11
    wysnylc  
       2020-02-04 11:11:07 +08:00 via Android
    把 id 提出来,还能有 35g ?
    ho121
        12
    ho121  
       2020-02-04 11:17:06 +08:00 via Android
    对每条数据 hash 后存到哈希表或者二叉树中。
    hash 算法也不需要碰撞率很低的那种,比如 crc32,crc64 这种简单的就行,这样可以加快 hash 速度,并减少内存使用。当碰到 hash 相同的,需要做完全匹配来判断数据是否真的是相等。
    哈希表或者二叉树每个节点要存下每个 hash 对应的 id (可能有多个)。

    数据用流式读取,或者扔进数据库中。


    手机码字,有点乱
    grimpil
        13
    grimpil  
       2020-02-04 11:18:08 +08:00 via Android   5
    还以为是 35 克数据
    fields
        14
    fields  
    OP
       2020-02-04 11:22:23 +08:00
    @grimpil 哈哈哈哈哈哈
        15
    keepeye  
       2020-02-04 11:24:07 +08:00
    遍历所有数据,id 字段走布隆过滤器去重 用不了多少内存
    mxT52CRuqR6o5
        16
    mxT52CRuqR6o5  
       2020-02-04 11:26:58 +08:00 via Android
    Bitmap
    binux
        17
    binux  
       2020-02-04 11:29:05 +08:00
    如果数据>>id,拿 id 出来随便爱怎么搞怎么搞
    如果数据就是 id,每 7g 分片排序再 merge 排序。
    zengguibo
        18
    zengguibo  
       2020-02-04 11:57:32 +08:00
    如果只是文本数据,压缩一下传到性能强内存大的机器上,直接导入内存去重
    Tlvncks
        19
    Tlvncks  
       2020-02-04 12:06:51 +08:00
    引用;@grimpil #13 还以为是 35 克数据

    -------------------------------------------------------
    我也看了半天,还在想 35g 啥玩意?难道想提纯??
    Rekkles
        20
    Rekkles  
       2020-02-04 12:19:26 +08:00
    数据 hash 然后对比去重?
    有个笨一点的办法,数据导入 db 做唯一索引 一条一条导入,导入失败的就是重复的,牺牲时间换空间。
    coolcfan
        21
    coolcfan  
       2020-02-04 12:26:52 +08:00 via Android
    跟 13 楼一样,看到是小写第一反应是 35 克数据……
    suotm
        22
    suotm  
       2020-02-04 12:36:19 +08:00
    取 3.5G 做好去重的脚本,然后开一个 64GB 内存的云主机跑
    lululau
        23
    lululau  
       2020-02-04 12:36:41 +08:00 via iPhone
    35g? 用什么称的?
    hhhsuan
        24
    hhhsuan  
       2020-02-04 12:39:39 +08:00 via Android
    大小写很重要啊
    netnr
        25
    netnr  
       2020-02-04 12:47:28 +08:00
    直接执行开窗函数按 id 分组排序取大于 1 的项并删除,难道顶不住?
    ofblyt
        26
    ofblyt  
       2020-02-04 13:19:18 +08:00
    最近做饭做的,看到 35g 还想 35 克去重( zhong )是给什么去皮吗
    yufeng0681
        27
    yufeng0681  
       2020-02-04 13:28:10 +08:00
    根据 id 第一位进行文件分拣(切割到),假设有 26 个字母,10 个数字; 估计每个文件 1G 左右,那样问题就变成了 1G 文件的处理
    gfreezy
        28
    gfreezy  
       2020-02-04 14:08:20 +08:00
    shell 里面 sort | uniq 就可以。内存不够的时候 sort 会自动交换到磁盘上。

    https://unix.stackexchange.com/questions/383056/sort-huge-list-130gb-in-linux
    fields
        29
    fields  
    OP
       2020-02-04 14:34:54 +08:00
    @lululau 电子秤吧
    fields
        30
    fields  
    OP
       2020-02-04 14:35:40 +08:00
    @ofblyt 姜吧
    fields
        31
    fields  
    OP
       2020-02-04 14:55:15 +08:00
    @gfreezy 存储有限的,都在数据库里
    fields
        32
    fields  
    OP
       2020-02-04 14:57:54 +08:00
    @yufeng0681 id 是纯数字,剩余的空间只有 7 个 G
    gfreezy
        33
    gfreezy  
       2020-02-04 16:02:47 +08:00
    @fields 建个新表加上 unique key,重新 load 一下就可以
    fuye
        34
    fuye  
       2020-02-05 09:44:08 +08:00 via Android
    create table tmp(id bigint,unique key id ( id ))
    insert into tmp select id from 你的表
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5321 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 07:05 PVG 15:05 LAX 00:05 JFK 03:05
    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