有什么好方法可以实现实时报表么

2016-05-27 17:46:42 +08:00
 aragakiiyui

最近碰到一个需求,要实现实时的报表,数据量一直处于递增状态。现在还好只有 100 多万条。我用的是 pandas 进行数据处理,然后生成相应的报表信息。 现在最大的消耗在遍历数据上面,即有个计算必须要遍历每一条数据才能得到结果。这样导致报表产生很慢,所以想问问各位 v 友有没有什么这方面的经验,恳请求多多指教···

4727 次点击
所在节点    Python
21 条回复
seki
2016-05-27 17:54:48 +08:00
要求什么值,需要遍历整个数据?设计的更新频率有多快?
总数平均值最大值之类的,找一个变量存起来,新数据进来之后基于新数据更新变量就好了
z5864703
2016-05-27 18:09:25 +08:00
在数据入库的时候就异步统计并保存到统计表,然后报表就直接实时输出统计表即可,这里稍微有些延迟
楼主要每次统计所有数据,还是只需计算新增的生成报表即可?
alexapollo
2016-05-27 22:05:58 +08:00
具体为什么要遍历数据?
ty0716
2016-05-27 22:54:18 +08:00
业务逻辑表述不清楚 /或许你姿势不对。

可以交给前端用 angularjs 或者 vuejs 来处理速度杠杠的
fire5
2016-05-27 22:59:08 +08:00
统计数据写入 redis 即可。
pimin
2016-05-27 23:13:50 +08:00
很难想象每次都遍历
正常应该递增的吧
wentx
2016-05-28 02:13:46 +08:00
@ty0716 如果前端是 angularjs 1.xxx 会有性能问题的
murmur
2016-05-28 08:31:35 +08:00
没有 除非你的报表计算能增量进行 或者能提前计算
报表这东西就这么复杂 哪里说优化一下就实时了
coolloves
2016-05-28 08:41:14 +08:00
可以试试 elasticsearch
aragakiiyui
2016-05-28 09:08:48 +08:00
@coolloves es 不适合做统计,我搜索的部分用的是这个
aragakiiyui
2016-05-28 09:10:02 +08:00
@seki 因为要根据规则取出所有符合条件的连续序列,所有必须遍历整个数据集。
aragakiiyui
2016-05-28 09:34:14 +08:00
@z5864703
@alexapollo
@ty0716
@murmur
我描述一下我要处理的数据吧,其实就是视频的每一祯,即每一秒就是一条记录(记录这一秒出现了啥东西),这条记录会存储到数据库里面。这样每个视频就是由多条记录组成。而每个用户有可以对应多部视频。所以针对每个用户去做一些统计信息。
遍历的原因:有个需求是要统计所有连续时间(比如连续 3 秒、连续 5 秒)出现同一样东西的个数。所以我认为这个遍历肯定少不了吧。。。
比较坑爹的地方: 要计算一些占比信息,而由于帧数在增长,所以每次都要重算。
aragakiiyui
2016-05-28 09:39:25 +08:00
@pimin 要实现递增有点难啊。打比方说要求平均值,最开始只有两个数字[1, 1] 然后得到了 1 。假如后面新增了一条记录,数据变成了[1,1,4],那么我只能重新遍历,求出新的平均值吧。
aragakiiyui
2016-05-28 09:44:26 +08:00
@fire5 这个目前考虑实现这种方式,但是依然要把所有数据都丢到 redis 。不知道后面吃得消吗。。
pimin
2016-05-28 10:01:44 +08:00
@aragakiiyui
拿平均数这个例子,需要统计的就是总和和个数。
每发送一次访问都更新和跟个数,把这两个数据存到数据库里。

具体来说就是产生数据的时候就更新统计信息。
而不是需要的时候再去统计。
alexapollo
2016-05-28 12:40:37 +08:00
@aragakiiyui 同意 pimin ,这是比较常规的做法
另外,如果觉得需求多变的话,把这个做成每天 /小时跑一次的任务也是可行的,统计报表只显示一个结果
alexapollo
2016-05-28 12:41:23 +08:00
如果要求强实时,那么增量写的方式对应的需求就得很固定,改需求就接受不了了。
lytofb
2016-05-28 12:45:56 +08:00
如果是递增的数据,按时间建立归档数据即可
hayao650
2016-05-29 08:39:05 +08:00
@aragakiiyui 记录前一次的平均值 a 和数量 c 呢?再有更新就只要计算 a*c 除以 c+1
hayao650
2016-05-29 08:40:23 +08:00
@hayao650 不好意思,应该是 a*c+new 除以 c+1

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

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

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

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

© 2021 V2EX