wheeler
V2EX  ›  数据库

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

  •  
  •   wheeler · Aug 9, 2023 · 3240 views
    This topic created in 1182 days ago, the information mentioned may be changed or developed.

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

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

    很久以前做过一个手机号 md5 的反查的工具,穷举国内手机号大概是 40 多亿个,基于二分法在硬盘上反查,普通固态上一秒我记得能处理大概四五千个吧。我估摸着数据库应该不会比这慢,不过数据塞到数据库里很烦,当时能用的数据库还是个机械硬盘,直接给我劝退了
    virusdefender
    virusdefender
    Aug 9, 2023❤️1
    8
    我这有个 1400w 的 sha256 存 boltdb 才 600 多 M
    aikdong
    aikdong
    Aug 9, 2023❤️1
    9
    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
    x77
    Aug 9, 2023 via Android❤️1
    10
    这种问题偏理论技术,偏工程的技术(放内存啥的)提升很有限,要鸟抢换炮的提升估计得有理论上的支撑
    rrfeng
    rrfeng
    Aug 9, 2023 via Android❤️1
    11
    除非没有 100M 内存,不然不需要选择…
    raycool
    raycool
    Aug 9, 2023❤️1
    12
    放内存里
    thinkershare
    thinkershare
    Aug 10, 2023❤️1
    13
    这么点数据,有啥可讨论的。
    UFc8704I4Bv63gy2
    UFc8704I4Bv63gy2
    Aug 10, 2023
    14
    @leonshaw
    >> 数据也就 100 多 M 而已
    这个数据量啥也不用想,放内存,遍历 @wheeler
    WuSiYu
    WuSiYu
    Aug 10, 2023❤️2
    15
    扔内存里用哈希表就行,用 redis 即可
    leonshaw
    leonshaw
    Aug 10, 2023
    16
    @weiqk 遍历有点暴力,排个序二分差不多了
    smirkcat
    smirkcat
    Aug 10, 2023❤️1
    17
    直接内存映射数据库 ,很多语言的都有,谷歌搜很多,python 我目前用到的,几千万数据,瞬间加载,就是初始化 db 文件需要点时间,后续查询非常快,上亿数据也没问题,内存映射数据应用到很区块链上和大数据分析上,可以了解一下啊
    smirkcat
    smirkcat
    Aug 10, 2023
    18
    @smirkcat python lmdb
    wxf666
    wxf666
    Aug 10, 2023
    19
    @leonshaw #16 用哈希应该更快些?
    leonshaw
    leonshaw
    Aug 10, 2023❤️1
    20
    @wxf666 本来就是 md5 了,可以直接参考页表构造几级索引
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5323 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 03:28 · PVG 11:28 · LAX 19:28 · JFK 22:28
    ♥ Do have faith in what you're doing.