求救!限时 12 小时! mongodb 存了 5 亿条 email,现有 100 万英文人名,想把包含人名的所有 email 找到,怎么办

2020-08-27 18:51:28 +08:00
 0x0208v0

如题:
马上下班了,突然来了一个需求,

mongodb 存了 5 亿条 email,现有 100 万英文人名,想把包含人名的所有 email 找到,怎么办,

我想破脑子都没想明白应该怎么做,感觉这个除了遍历没有其他方法了,

如果遍历的话,是 O(mn),也就是 100 百万 * 5 亿次匹配,这也太慢了,12 个小时也搞不完,求大佬帮忙想想办法。

12352 次点击
所在节点    问与答
120 条回复
0x0208v0
2020-08-27 18:52:56 +08:00
这种需求能实现吗,如果不能的话我就辞职了 :( 好难过,这数据量已经让我所有办法无效了
leido
2020-08-27 18:55:39 +08:00
email 根据人名排序, 然后二分查找.
xupefei
2020-08-27 18:56:06 +08:00
多开几台机器分块跑呗。mongo 那边只读,性能瓶颈就是那台机器的硬盘和网络带宽。

同时匹配所有人名用 Aho Corasick 算法。
a719114136
2020-08-27 18:56:50 +08:00
人名存字典
AX5N
2020-08-27 18:58:05 +08:00
建立索引+多线程?
br00k
2020-08-27 19:00:55 +08:00
有索引直接查库效率应该还可以。100w 开多个线程应该也挺快的。
a719114136
2020-08-27 19:00:58 +08:00
最好的方法还是临时起个数据库,人名都放进去,这样方便多台机器同时跑
qq316107934
2020-08-27 19:01:57 +08:00
每一封 email 不长的话分词然后用布隆过滤器,效率很高的,扫一遍就行。
0x0208v0
2020-08-27 19:02:18 +08:00
不行啊,如果人名是 tom,email 是 hahatom666@gmail.com 那么人名存字典是不行的
qq316107934
2020-08-27 19:02:50 +08:00
上面说要建索引的,我理解这是说正文包含指定人名的吧,建立全文索引太慢了。
qq316107934
2020-08-27 19:04:17 +08:00
@v2exblog #9 楼主得再说清楚点,是在哪个字段寻找人名,正文还是发件人还是 email,可以精确匹配,左匹配,可以分词,还是只能正则模糊匹配。
0x0208v0
2020-08-27 19:06:22 +08:00
在 email 字段寻找人名
rrfeng
2020-08-27 19:06:41 +08:00
有索引吗?

没有的话 100w 人名先 hash 一下,然后遍历 5 亿数据,对比只要 O(1),也就是 5 亿次。
100w 人名也用不了太多存储
heiheidewo
2020-08-27 19:20:16 +08:00
先把 100 万英文人名建立好 AC 自动机,然后扫一遍 5 亿 email 用不了多久吧?
matrix1010
2020-08-27 20:04:32 +08:00
当然能实现,也不要 100 万 x5 亿次,但如果公司真限定你一个人 12 小时做完那你还是辞职吧
0x0208v0
2020-08-27 20:10:31 +08:00
@matrix1010 哭了,太难了
whahuzhihao
2020-08-27 20:22:47 +08:00
放到 es 里面搜?空间换时间
loading
2020-08-27 20:28:21 +08:00
只有两个字段吗?
排序然后二分不已经很快了吗?
pcbl
2020-08-27 20:28:59 +08:00
先随机给每一个邮箱找些出来交差,老板要是说数据不对的话,怼他让他 24 小时内核对下试试。。
Mutoo
2020-08-27 20:36:26 +08:00
100 万英文人名 先折分去重一下,不至于有这么多。英文重名率挺高的。

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

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

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

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

© 2021 V2EX