V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
aragakiiyui
V2EX  ›  Python

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

  •  
  •   aragakiiyui · 2016-05-27 17:46:42 +08:00 · 4631 次点击
    这是一个创建于 2890 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2016-05-28 09:45:52 +08:00

    我描述一下我要处理的数据吧,其实就是视频的每一祯,即每一秒就是一条记录(记录这一秒出现了啥东西),这条记录会存储到数据库里面。这样每个视频就是由多条记录组成。而每个用户有可以对应多部视频。所以针对每个用户去做一些统计信息。

    • 遍历的原因:有个需求是要统计所有连续时间(比如连续 3 秒、连续 5 秒)出现同一样东西的个数。所以我认为这个遍历肯定少不了吧。。。
    • 比较坑爹的地方: 要计算一些占比信息,而由于帧数在增长,所以每次都要重算。
    21 条回复    2016-05-29 12:23:12 +08:00
    seki
        1
    seki  
       2016-05-27 17:54:48 +08:00
    要求什么值,需要遍历整个数据?设计的更新频率有多快?
    总数平均值最大值之类的,找一个变量存起来,新数据进来之后基于新数据更新变量就好了
    z5864703
        2
    z5864703  
       2016-05-27 18:09:25 +08:00
    在数据入库的时候就异步统计并保存到统计表,然后报表就直接实时输出统计表即可,这里稍微有些延迟
    楼主要每次统计所有数据,还是只需计算新增的生成报表即可?
    alexapollo
        3
    alexapollo  
       2016-05-27 22:05:58 +08:00
    具体为什么要遍历数据?
    ty0716
        4
    ty0716  
       2016-05-27 22:54:18 +08:00
    业务逻辑表述不清楚 /或许你姿势不对。

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

    具体来说就是产生数据的时候就更新统计信息。
    而不是需要的时候再去统计。
    alexapollo
        16
    alexapollo  
       2016-05-28 12:40:37 +08:00
    @aragakiiyui 同意 pimin ,这是比较常规的做法
    另外,如果觉得需求多变的话,把这个做成每天 /小时跑一次的任务也是可行的,统计报表只显示一个结果
    alexapollo
        17
    alexapollo  
       2016-05-28 12:41:23 +08:00
    如果要求强实时,那么增量写的方式对应的需求就得很固定,改需求就接受不了了。
    lytofb
        18
    lytofb  
       2016-05-28 12:45:56 +08:00
    如果是递增的数据,按时间建立归档数据即可
    hayao650
        19
    hayao650  
       2016-05-29 08:39:05 +08:00 via Android
    @aragakiiyui 记录前一次的平均值 a 和数量 c 呢?再有更新就只要计算 a*c 除以 c+1
    hayao650
        20
    hayao650  
       2016-05-29 08:40:23 +08:00 via Android
    @hayao650 不好意思,应该是 a*c+new 除以 c+1
    fire5
        21
    fire5  
       2016-05-29 12:23:12 +08:00
    @aragakiiyui 没有什么吃不消的,一台吃不消,就两台
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5576 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 175ms · UTC 02:42 · PVG 10:42 · LAX 19:42 · JFK 22:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.