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

275 天前
 wheeler

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

1903 次点击
所在节点    数据库
20 条回复
xmh51
275 天前
使用嵌入式的磁盘 key value 数据库即可
https://github.com/jankotek/mapdb
https://github.com/berkeleydb/je
xmh51
275 天前
推荐 berkeleydb
qwerthhusn
275 天前
看下布隆过滤器能不能满足需求
kokutou
275 天前
按开头首字母数字分成 32 个库扔固态上,分 32 个地址去查询,会比直接一个数据库查快吗?
或者 32^32 个库呢?
leonshaw
275 天前
数据也就 100 多 M 而已
dode
275 天前
树结构,分层,分区,可以优化命中次数
Vegetable
275 天前
别想了,数据库就是最好的办法。其他方法都快不了多少,但是多费不少事儿。

很久以前做过一个手机号 md5 的反查的工具,穷举国内手机号大概是 40 多亿个,基于二分法在硬盘上反查,普通固态上一秒我记得能处理大概四五千个吧。我估摸着数据库应该不会比这慢,不过数据塞到数据库里很烦,当时能用的数据库还是个机械硬盘,直接给我劝退了
virusdefender
275 天前
我这有个 1400w 的 sha256 存 boltdb 才 600 多 M
aikdong
275 天前
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
275 天前
这种问题偏理论技术,偏工程的技术(放内存啥的)提升很有限,要鸟抢换炮的提升估计得有理论上的支撑
rrfeng
275 天前
除非没有 100M 内存,不然不需要选择…
raycool
275 天前
放内存里
thinkershare
275 天前
这么点数据,有啥可讨论的。
weiqk
275 天前
@leonshaw
>> 数据也就 100 多 M 而已
这个数据量啥也不用想,放内存,遍历 @wheeler
WuSiYu
275 天前
扔内存里用哈希表就行,用 redis 即可
leonshaw
275 天前
@weiqk 遍历有点暴力,排个序二分差不多了
smirkcat
274 天前
直接内存映射数据库 ,很多语言的都有,谷歌搜很多,python 我目前用到的,几千万数据,瞬间加载,就是初始化 db 文件需要点时间,后续查询非常快,上亿数据也没问题,内存映射数据应用到很区块链上和大数据分析上,可以了解一下啊
smirkcat
274 天前
@smirkcat python lmdb
wxf666
274 天前
@leonshaw #16 用哈希应该更快些?
leonshaw
274 天前
@wxf666 本来就是 md5 了,可以直接参考页表构造几级索引

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/963886

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX