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

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

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

13728 次点击
所在节点    数据库
104 条回复
sockpuppet9527
2021-01-25 14:16:49 +08:00
假设,目前你的 13 亿个名字都在内存里面。每个名字都是两个字的,13 亿*2byte ≈ 2.42G(连续内存,且无对齐)

你机器用的是 intel 的 cpu,还存在 AVX512,现在一条 vmovups 指令,他的 latency 是 7,它的 throughput 是 0.5,那么对于 ZMM0-32 来说,你要调用 32 次,throughput 就是 16,latency 是 112 。

而这条 vmovups 指令,这能读多大的数据呢? 2kb 。(这前提还是你没有任何辅助寄存器的情况下)也就是说将 13 亿名字全部 load 到 ZMM 寄存器组的次数是:2.42G / 2kb = 1269531.25 次。

总 latency 是 1269531.25*112 = 142187500, 总 throughput 为 1269531.25*16=20312500

(以上结果是抛开内存频率,内存寻址时间计算,如果加上其他因素,可能需要乘个 100 或者更大。)

是不是觉得 latency 和 throughput 都还行?

那其实你把数据打散在一万个内存里面,每个内存中单独配 N 个 CPU,也许不用 1s 就能算出来。这完全取决于你汇编写的怎么样,以及你的硬件条件。
namelosw
2021-01-25 14:22:38 +08:00
搞个提前算好的读模型, 写入新名字的时候累加一下就好了
shenlanAZ
2021-01-25 14:29:10 +08:00
提前 map reduce 好,存到数据库里。然后用 500ms 的速度从数据库里查出来。
zlowly
2021-01-25 14:39:53 +08:00
不用说现在的 ES 这种方式可以做到(结果不精确),就算是以前的集中式关系数据库来说,这种需求也真没什么(结果精确)。例如用 Oracle,直接对姓名统计使用物化视图即可,其核心原理就是在原始数据变更时通过触发器更新统计数据而已。
neetrorschach
2021-01-25 14:41:40 +08:00
如果数据不是实时更新的话用 kylin,会将选定维度的所有组合创建成索引保存在内存里。查询时只要限定字段在索引维度里,基本上是亚秒查询。
AkideLiu
2021-01-25 14:41:52 +08:00
可能性是有的,你看 Google 存的数据比你大,响应也在毫毛级别。重点是有没有这个技术实力
Takamine
2021-01-25 14:42:20 +08:00
昨天晚上算完,今天调接口都返回这个值。
tanszhe
2021-01-25 15:09:46 +08:00
@cage111 看楼主这个需求 1 个字段就够了,order by name; 肯定非常快
anonyp
2021-01-25 15:16:32 +08:00
clickhouse name 索引就行了吧,更快的话可以试试物化视图,这个场景应该很适合
DollarKiller
2021-01-25 15:32:43 +08:00
多台机器一起 MapReduce
est
2021-01-25 15:33:02 +08:00
@gstqc 并行优化下。
cage111
2021-01-25 15:43:37 +08:00
@tanszhe 不加 where 内存不够用了,测试机器只配了 16g 内存,加了类似性别的字段过滤后用时 4s 。
结果如下
china> select name ,count(*) from person where category = 'XXX' group by name order by count(1) desc limit 0,10
[2021-01-25 15:34:03] 10 rows retrieved starting from 1 in 3 s 995 ms (execution: 3 s 973 ms, fetching: 22 ms)
cage111
2021-01-25 15:45:18 +08:00
@anonyp 有查询条件也能做视图吗
tanszhe
2021-01-25 15:45:34 +08:00
@cage111 我造点数据试试
anonyp
2021-01-25 16:04:30 +08:00
@cage111 summingmergetree 这个引擎试试
northisland
2021-01-25 16:23:31 +08:00
1.3G 次( 字符串摘要 + 哈希表 )

按 0.9s 速度进行并发执行。0.1s 留个多个哈系表合并 + top10 排序。
tanszhe
2021-01-25 16:25:11 +08:00
@cage111 我 1 核 2G 内测 虚拟机 可以正常运行 13.5 亿数据,不过时间有点长 23s
tanszhe
2021-01-25 16:26:20 +08:00
hehe12980
2021-01-25 16:27:23 +08:00
@shoaly 开 100 个线程 .... 一共也没几个核 开那么多有啥用
DrJoseph
2021-01-25 16:51:00 +08:00
坐等蚂蚁的同学提供 OceanBase 的可行方案,毕竟隔壁已经用 ClickHouse 解决了
传送门: https://tanronggui.xyz/t/748196#reply8

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

https://tanronggui.xyz/t/748059

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

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

© 2021 V2EX