最近碰到一个需求,要实现实时的报表,数据量一直处于递增状态。现在还好只有 100 多万条。我用的是 pandas 进行数据处理,然后生成相应的报表信息。 现在最大的消耗在遍历数据上面,即有个计算必须要遍历每一条数据才能得到结果。这样导致报表产生很慢,所以想问问各位 v 友有没有什么这方面的经验,恳请求多多指教···
我描述一下我要处理的数据吧,其实就是视频的每一祯,即每一秒就是一条记录(记录这一秒出现了啥东西),这条记录会存储到数据库里面。这样每个视频就是由多条记录组成。而每个用户有可以对应多部视频。所以针对每个用户去做一些统计信息。
1
seki 2016-05-27 17:54:48 +08:00
要求什么值,需要遍历整个数据?设计的更新频率有多快?
总数平均值最大值之类的,找一个变量存起来,新数据进来之后基于新数据更新变量就好了 |
2
z5864703 2016-05-27 18:09:25 +08:00
在数据入库的时候就异步统计并保存到统计表,然后报表就直接实时输出统计表即可,这里稍微有些延迟
楼主要每次统计所有数据,还是只需计算新增的生成报表即可? |
3
alexapollo 2016-05-27 22:05:58 +08:00
具体为什么要遍历数据?
|
4
ty0716 2016-05-27 22:54:18 +08:00
业务逻辑表述不清楚 /或许你姿势不对。
可以交给前端用 angularjs 或者 vuejs 来处理速度杠杠的 |
5
fire5 2016-05-27 22:59:08 +08:00
统计数据写入 redis 即可。
|
6
pimin 2016-05-27 23:13:50 +08:00
很难想象每次都遍历
正常应该递增的吧 |
8
murmur 2016-05-28 08:31:35 +08:00
没有 除非你的报表计算能增量进行 或者能提前计算
报表这东西就这么复杂 哪里说优化一下就实时了 |
9
coolloves 2016-05-28 08:41:14 +08:00 via Android
可以试试 elasticsearch
|
10
aragakiiyui OP @coolloves es 不适合做统计,我搜索的部分用的是这个
|
11
aragakiiyui OP @seki 因为要根据规则取出所有符合条件的连续序列,所有必须遍历整个数据集。
|
12
aragakiiyui OP @z5864703
@alexapollo @ty0716 @murmur 我描述一下我要处理的数据吧,其实就是视频的每一祯,即每一秒就是一条记录(记录这一秒出现了啥东西),这条记录会存储到数据库里面。这样每个视频就是由多条记录组成。而每个用户有可以对应多部视频。所以针对每个用户去做一些统计信息。 遍历的原因:有个需求是要统计所有连续时间(比如连续 3 秒、连续 5 秒)出现同一样东西的个数。所以我认为这个遍历肯定少不了吧。。。 比较坑爹的地方: 要计算一些占比信息,而由于帧数在增长,所以每次都要重算。 |
13
aragakiiyui OP @pimin 要实现递增有点难啊。打比方说要求平均值,最开始只有两个数字[1, 1] 然后得到了 1 。假如后面新增了一条记录,数据变成了[1,1,4],那么我只能重新遍历,求出新的平均值吧。
|
14
aragakiiyui OP @fire5 这个目前考虑实现这种方式,但是依然要把所有数据都丢到 redis 。不知道后面吃得消吗。。
|
15
pimin 2016-05-28 10:01:44 +08:00 via Android 1
|
16
alexapollo 2016-05-28 12:40:37 +08:00
@aragakiiyui 同意 pimin ,这是比较常规的做法
另外,如果觉得需求多变的话,把这个做成每天 /小时跑一次的任务也是可行的,统计报表只显示一个结果 |
17
alexapollo 2016-05-28 12:41:23 +08:00
如果要求强实时,那么增量写的方式对应的需求就得很固定,改需求就接受不了了。
|
18
lytofb 2016-05-28 12:45:56 +08:00
如果是递增的数据,按时间建立归档数据即可
|
19
hayao650 2016-05-29 08:39:05 +08:00 via Android
@aragakiiyui 记录前一次的平均值 a 和数量 c 呢?再有更新就只要计算 a*c 除以 c+1
|
21
fire5 2016-05-29 12:23:12 +08:00
@aragakiiyui 没有什么吃不消的,一台吃不消,就两台
|