如何在 1s 内统计出 13 亿人口数据找出使用人数最多的十个姓名

2021-01-25 10:32:21 +08:00
 cage111

请教下各位大佬这种需求可以实现吗

13728 次点击
所在节点    数据库
104 条回复
cstj0505
2021-01-25 12:07:44 +08:00
靠数据库的 group by 不可取,这不是什么数据库的问题,group by 是数据库最慢的执行操作之一,而且还需要消耗大量内存和 CPU 。
建议 lz 要么采用上面说的字典树,要么了解下现在行为分析的玩法,用数组或者在数据库里用 map 结构预聚合。别说 1s 了,我们百亿级别的数据 60ms 就能出。3 台节点的 gp 。
magiclx
2021-01-25 12:08:26 +08:00
因为问题并不是从 13 亿短字符串中统计出现频率最高的 10 个,而是 13 亿人口姓名数据。

人口姓名是相对稳定的,你只要计算一次存量数据,然后计算增量即可随时把结果拿出来。具体来说:

1 、通过 Google 获知我国每日平均出生人数 2 万多,每日死亡人数为 1 万多,具体数值不重要,知道规模为 5 万以下即可。
2 、建一张统计表 S 存目前排名前 5 万的姓名和人数,当人员出生,人数增加,把该姓名人数加 1 后 REPLACE INTO 到表 S 中,当人员死亡,人数减少,如果死亡人员姓名在表 S 中,则人数减一。
3 、定时删除表 S 中大于 5 万的数据。
4 、当需要统计出 13 亿人口中使用人数最多的十个姓名时,只要 SELECT TOP 10 即可,因为只有 5 万数据,所以无论如何都会在 1S 内。
chocovon
2021-01-25 12:08:53 +08:00
可以先做一轮数据清洗,把那些不论选什么条件都不是 top10 的姓名给剔除掉,这样大概可以去掉一大堆?
wms
2021-01-25 12:20:48 +08:00
预处理阶段, 用元数据(姓名, 年龄,性别等)生成 SHA, SHA 值做 KEY 建立数据库, 然后根据查询条件建立查找树或者堆, 查询的时候直接取相应树,堆的 TOP 通过 SHA 值去数据库取数据
wq2016
2021-01-25 12:21:34 +08:00
百度一下
nl101531
2021-01-25 12:24:29 +08:00
es rollup 到一个新索引,查询走新的索引
337136897
2021-01-25 12:26:04 +08:00
楼主这个数据库在哪...
SuperMild
2021-01-25 12:59:16 +08:00
由于数据量很小,完全可以预存一堆静态数据,比如,只要预存了 20 岁、21 岁、22 岁... 每个年龄使用人数最多的十个姓名,那想查 20-30 岁使用人数最多的十个姓名就很快了。地区也同理。
x2ve
2021-01-25 13:22:14 +08:00
不要太执着于数据和技术角度,会很累的。 从业务角度来看 就是一个统计事件,而且这么大的数据,知道个趋势就行了;每天晚上把各个维度都清洗放多个表里就好,又能完成任务又方便
flippydoo
2021-01-25 13:25:48 +08:00
字典树
weizhen199
2021-01-25 13:26:11 +08:00
塞进 clickhouse 这种还真是分分钟出来
crs0910
2021-01-25 13:32:55 +08:00
@weizhen199 #51 分分钟莫名戳中笑点
arvinwangzj
2021-01-25 13:40:07 +08:00
@tiancaixiaoshuai 哈哈哈,机智
lambdaq
2021-01-25 13:40:20 +08:00
@cage111 试试把 String 字段换成 FixedString(N) ,只保存一个单字姓呢?

CH 的 SIMD 需要内存对齐才能提速。
jackhe
2021-01-25 13:49:01 +08:00
先数据取样?
PopRain
2021-01-25 13:49:19 +08:00
13 亿用户,简单说就是 1.3G , 如果数据在外设上,你轮询一遍(把名字加载到内存),1s 时间也不够吧....
lerry
2021-01-25 13:49:49 +08:00
MapReduce
EnreIde
2021-01-25 13:54:15 +08:00
trie
0ZXYDDu796nVCFxq
2021-01-25 13:54:38 +08:00
13 亿人名
1300000000
4 GHz 为 4 * 1000^3
4*1000^3/1300000000 = 3
平均每个名字的处理时间是三个时钟周期
Rainyf
2021-01-25 14:10:44 +08:00
@tiancaixiaoshuai 哈哈哈绝了

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

https://tanronggui.xyz/t/748059

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

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

© 2021 V2EX