请问 1000 万级别的 md5 条目(16 字节)需要能够尽可能快判断 exists,同时最好能够节省存储资源,应该怎么做比较好呢 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wheeler
V2EX    数据库

请问 1000 万级别的 md5 条目(16 字节)需要能够尽可能快判断 exists,同时最好能够节省存储资源,应该怎么做比较好呢

  •  
  •   wheeler 2023-08-09 22:00:27 +08:00 2533 次点击
    这是一个创建于 867 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前是直接灌的 sqlite ,不知道有没更好的做法

    20 条回复    2023-08-10 18:25:59 +08:00
    xmh51
        1
    xmh51  
       2023-08-09 22:07:04 +08:00
    使用嵌入式的磁盘 key value 数据库即可
    https://github.com/jankotek/mapdb
    https://github.com/berkeleydb/je
    xmh51
        2
    xmh51  
       2023-08-09 22:08:12 +08:00   1
    推荐 berkeleydb
    qwerthhusn
        3
    qwerthhusn  
       2023-08-09 22:09:13 +08:00   1
    看下布隆过滤器能不能满足需求
    kokutou
        4
    kokutou  
       2023-08-09 22:17:08 +08:00 via Android   1
    按开头首字母数字分成 32 个库扔固态上,分 32 个地址去查询,会比直接一个数据库查快吗?
    或者 32^32 个库呢?
    leonshaw
        5
    leonshaw  
       2023-08-09 22:17:45 +08:00   2
    数据也就 100 多 M 而已
    dode
        6
    dode  
       2023-08-09 22:23:12 +08:00 via Android   1
    树结构,分层,分区,可以优化命中次数
    Vegetable
        7
    Vegetable  
       2023-08-09 22:26:16 +08:00   1
    别想了,数据库就是最好的办法。其他方法都快不了多少,但是多费不少事儿。

    很久以前做过一个手机号 md5 的反查的工具,穷举国内手机号大概是 40 多亿个,基于二分法在硬盘上反查,普通固态上一秒我记得能处理大概四五千个吧。我估摸着数据库应该不会比这慢,不过数据塞到数据库里很烦,当时能用的数据库还是个机械硬盘,直接给我劝退了
    virusdefender
        8
    virusdefender  
       2023-08-09 22:27:27 +08:00   1
    我这有个 1400w 的 sha256 存 boltdb 才 600 多 M
    aikdong
        9
    aikdong  
       2023-08-09 22:28:21 +08:00   1
    1000 万直接放内存里面,单线程 1000 万次比较 0.36s:
    ```python
    import string
    import random
    # initializing size of string
    N = 16
    data = set()
    for i in range(10000*1000):
    data.add(''.join(random.choices(string.ascii_letters, k=N)))

    start=time.time()
    sample = ''.join(random.choices(string.ascii_letters, k=N))
    for _ in range(10000*1000):
    if sample in data:
    pass
    end=time.time()
    print("set:", end-start)
    ```
    x77
        10
    x77  
       2023-08-09 22:35:37 +08:00 via Android   1
    这种问题偏理论技术,偏工程的技术(放内存啥的)提升很有限,要鸟抢换炮的提升估计得有理论上的支撑
    rrfeng
        11
    rrfeng  
       2023-08-09 23:03:43 +08:00 via Android   1
    除非没有 100M 内存,不然不需要选择…
    raycool
        12
    raycool  
       2023-08-09 23:54:00 +08:00   1
    放内存里
    thinkershare
        13
    thinkershare  
       2023-08-10 00:17:44 +08:00   1
    这么点数据,有啥可讨论的。
    UFc8704I4Bv63gy2
        14
    UFc8704I4Bv63gy2  
       2023-08-10 00:21:45 +08:00
    @leonshaw
    >> 数据也就 100 多 M 而已
    这个数据量啥也不用想,放内存,遍历 @wheeler
    WuSiYu
        15
    WuSiYu  
       2023-08-10 00:29:58 +08:00   2
    扔内存里用哈希表就行,用 redis 即可
    leonshaw
        16
    leonshaw  
       2023-08-10 00:32:30 +08:00
    @weiqk 遍历有点暴力,排个序二分差不多了
    smirkcat
        17
    smirkcat  
       2023-08-10 10:12:03 +08:00   1
    直接内存映射数据库 ,很多语言的都有,谷歌搜很多,python 我目前用到的,几千万数据,瞬间加载,就是初始化 db 文件需要点时间,后续查询非常快,上亿数据也没问题,内存映射数据应用到很区块链上和大数据分析上,可以了解一下啊
    smirkcat
        18
    smirkcat  
       2023-08-10 10:12:49 +08:00
    @smirkcat python lmdb
    wxf666
        19
    wxf666  
       2023-08-10 17:20:40 +08:00
    @leonshaw #16 用哈希应该更快些?
    leonshaw
        20
    leonshaw  
       2023-08-10 18:25:59 +08:00   1
    @wxf666 本来就是 md5 了,可以直接参考页表构造几级索
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2998 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 13:07 PVG 21:07 LAX 05:07 JFK 08:07
    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