V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lovelybear
V2EX  ›  程序员

大数据的显示优化问题

  •  
  •   lovelybear · 2018-09-06 19:18:16 +08:00 · 2537 次点击
    这是一个创建于 2272 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们现在的软件的数据量比较庞大,大概 200-300 万的节奏,用户希望可以将我们的数据以图表的方式,用 select 语句查询到的数据大概有 1w 以上,如果显示在图表上的话,会很慢,影响用户体验。请问如何优化呢? 其实,编程不仅仅是实现功能,内部的优化才是真正体现功力的地方,以前的编程过于注重业务逻辑,而忽视性能优化,这的确是个错误啊!

    15 条回复    2018-09-14 10:30:17 +08:00
    swcat
        1
    swcat  
       2018-09-06 19:45:38 +08:00 via Android
    缓存,定时更新
    fangchang
        2
    fangchang  
       2018-09-06 19:48:57 +08:00
    materialize
    lovelybear
        3
    lovelybear  
    OP
       2018-09-06 20:16:04 +08:00
    @fangchang C# WPF 的
    lovelybear
        4
    lovelybear  
    OP
       2018-09-06 20:16:42 +08:00
    @swcat 嗯,具体如何操作呢?比如写个类定时更新,然后缓存进内存或者是文件?
    swcat
        5
    swcat  
       2018-09-06 20:34:47 +08:00 via Android
    function getData()
    {
    if (cache.hasExpired() )
    {
    cache.update()
    }
    return cache.data
    }

    hasExpired 方法就是你的更新策略,
    如果写少读多,可以设置为最后更新时间
    不确定就弄成定时更新
    swcat
        6
    swcat  
       2018-09-06 20:35:38 +08:00 via Android
    写进文件还是内存看情况啊
    lihongjie0209
        7
    lihongjie0209  
       2018-09-06 20:48:13 +08:00
    图表是什么数据? 报表: 统计性的 或者是地图: 展示型的


    对于统计型
    如果数据是只读的, 那么你可以提前计算好, 存哪里无所谓, 然后展示给用户看
    如果数据是可写的, 那么就需要你动态计算了, 也就是你提到的会卡
    以上两种方法的混合解决方案: 首先定时计算, 但是这个数据可能是不准确的, 因为数据还可写, 在每次更新数据的时候重新计算一遍, 最佳退化到只读的情况, 最差退化到可写的情况.



    对于展示型的数据:
    展示粒度没必须要那么细, 一万条数据 1000 条展示个大概, 放大的时候再加载嘛
    liprais
        8
    liprais  
       2018-09-06 20:56:20 +08:00 via Android
    预先计算,近似估计
    mingyun
        9
    mingyun  
       2018-09-06 22:45:38 +08:00
    clickhouse 了解下 300 亿数据查询几秒
    lovelybear
        10
    lovelybear  
    OP
       2018-09-07 08:31:01 +08:00 via Android
    @lihongjie0209 就是 chart 控件
    owenliang
        11
    owenliang  
       2018-09-07 09:10:34 +08:00 via Android
    elasticsearch 间隔取样
    Eoston
        12
    Eoston  
       2018-09-07 09:23:10 +08:00
    数据采样
    lovelybear
        13
    lovelybear  
    OP
       2018-09-07 09:36:21 +08:00 via Android
    @Eoston 恩看上去是这样,但请问具体如何实现?
    比如
    int totallength=mydata.Length;

    for (eachdata in mydata)
    {

    }
    Eoston
        14
    Eoston  
       2018-09-13 09:43:29 +08:00   ❤️ 1
    @lovelybear 对这一万条数据每隔 10 条取一条,然后综合返回给前端~~数据量特别大的时候,可以用多线程对拿到的数据分组,每组里面隔一定的数据取出来
    lovelybear
        15
    lovelybear  
    OP
       2018-09-14 10:30:17 +08:00
    @Eoston 多谢,问题已经解决了,隔 50 取一条
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3236 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 13:10 · PVG 21:10 · LAX 05:10 · JFK 08:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.