前端万级数据量的图表中,数据应该怎么获取? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kiritoxf
V2EX    前端开发

前端万级数据量的图表中,数据应该怎么获取?

  •  
  •   kiritoxf 2022-05-05 13:29:55 +08:00 3305 次点击
    这是一个创建于 1262 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据量大概两三万左右,前端是 react + echarts (或者 d3 ),后端是 java

    由于业务需求,这些数据都是有意义的,要都显示出来

    我的想法是调一个接口一次性把所有数据全返回来

    但是后端说微服务不能这么干,内存也装不下什么的,让我 500 条一次,手动依次获取全部数据

    我就很迷茫了,以前也没这么做过不知道对不对

    aragakiyuii
        1
    aragakiyuii  
       2022-05-05 13:34:55 +08:00
    目测数据结构不会很复杂(猜的)两三万占不了多少的
    rapperx2
        2
    rapperx2  
       2022-05-05 13:35:50 +08:00
    怎么获取不重要,重要的是你前端怎么显示
    kiritoxf
        3
    kiritoxf  
    OP
       2022-05-05 13:37:45 +08:00
    每条数据除了一些基本信息(字符串什么的)外,还会有一个 300 多个浮点数的数组
    @aragakiyuii
    kiritoxf
        4
    kiritoxf  
    OP
       2022-05-05 13:38:46 +08:00
    @rapperx2 是个散点图,可以缩放,由于某些原因这些数据之间的位置是有意义的,所以要都拿出来
    lessMonologue
        5
    lessMonologue  
       2022-05-05 13:40:04 +08:00 via Android
    不能自己多调用几次后端接口然后拼接起来吗
    murmur
        6
    murmur  
       2022-05-05 13:42:08 +08:00
    抽样呗,3w 个点到一个图上都一坨糊了,抽到 3000 个点跟 3w 个看上去也是一坨 shi 糊
    ss098
        7
    ss098  
       2022-05-05 13:42:22 +08:00
    后端确实不适合一次性输出所有数据,还是前端分页自己拼接比较好。
    wonderfulcxm
        8
    wonderfulcxm  
       2022-05-05 13:44:14 +08:00 via iPhone
    可以同时发几条 ajax 请求,并行下载,然后把结果组装。就好像开启了迅雷的多线程下载,肯定比一次性取全部数据快。
    rapperx2
        9
    rapperx2  
       2022-05-05 13:44:35 +08:00
    @kiritoxf 那你应该让后端一次性提供给你啊,不能只讲数量,也要看数据包大小。包大就压缩传输,几万条数据只取需要的字段能占多大内存。实在不行,缩写字段等方式,这些应该后端来思考吧
    nieboqiang
        10
    nieboqiang  
       2022-05-05 13:51:22 +08:00
    @lessMonologue 不太合理,过程过多,出错的概率越大。
    lessMonologue
        11
    lessMonologue  
       2022-05-05 13:57:18 +08:00
    @nieboqiang 合理。这个也不是说类似订单状态的流转啥的多次请求,就单纯的读数据,合理的很。如果前端不想做,那就后端再写一个聚合接口拼装数据。
    netnr
        12
    netnr  
       2022-05-05 13:59:52 +08:00 via Android   3
    后端字符串打包压缩为 ZIP ,前端下载解压读取解析,例大文件导出 https://www.netnr.com/run/code/5328511666506473654
    rabbbit
        13
    rabbbit  
       2022-05-05 14:00:48 +08:00
    散点图要是全显示 30000/500, 前端请求 60 次, 要分组也是 5000 一组吧?

    啥业务?
    必须全部输出展示?
    内网用还是外网用?
    是否在意流量?
    业务不同设计也不同
    rabbbit
        14
    rabbbit  
       2022-05-05 14:03:51 +08:00
    那个 300 多的数组就别一起发过来了, 用户点击的时候发 id 查吧.
    rabbbit
        15
    rabbbit  
       2022-05-05 14:11:17 +08:00
    如果做的 OA 之类的内网用根本没几个用户的系统,纯粹是后端偷懒不想加接口那就直接传 {size: 999999999} 吧.
    kiritoxf
        16
    kiritoxf  
    OP
       2022-05-05 14:24:09 +08:00
    @rabbbit 300 多的数组有用,要用这些 300 * 3 万 的浮点数来计算出具体的横纵坐标

    现在确实算是内网,但是将来说不准,可能是为了考虑全面吧
    kiritoxf
        17
    kiritoxf  
    OP
       2022-05-05 14:28:53 +08:00
    我现在打算用类似如下的伪代码来解决

    不并发是因为后端说同时发一堆请求不好,好像对微服务有影响什么的

    ```
    const fetchListData = (page: number) => {
    getData({ page, pageSize: 5000 }).then((res) => {
    // 自己拼一个数组
    myList.push(res.list);
    // 如果当前页还没到总页数,就 page+1 再获取一次
    if (res.page !== res.totalPage) {
    fetchListData(page + 1);
    } else {
    // 初始化图表
    }
    })
    }
    ```
    GG668v26Fd55CP5W
        18
    GG668v26Fd55CP5W  
       2022-05-05 14:31:13 +08:00   1
    @netnr #11 web server 一般都可以配置根据 content-encoding: gzip 返回压缩后的内容,浏览器解压是也是自动的啊,为什么还要前端解压缩?
    rabbbit
        19
    rabbbit  
       2022-05-05 14:43:35 +08:00
    @kiritoxf
    还是先别管后端咋传了,先搞个{ size: 999999999 }把数据展示出来再说.1 千万前端能撑住吗?
    内存装不下倒是有点扯
    jy02534655
        20
    jy02534655  
       2022-05-05 14:53:51 +08:00
    echarts 本身是有配置支持大数据量优化的,至于怎么取数据上面已经说了
    itsme001
        21
    itsme001  
       2022-05-05 15:12:42 +08:00
    散点图 点超过一定量 后浏览器端会卡的。具体是多少忘了,以前遇到过。
    没超过这个量让后端写个接口一次返回。
    超过这个量考虑
    1.做同含义的展示。后端做对应聚合。
    2.server side render ,后端根据前端传参直接返回 png 。
    这个问题 pyviz ,holoviz 有一篇文章写的很好。是关于大量数据展示的聚合、采样、渲染的。

    我不太清楚前端情况,几个可视化库应该是有 server side render 方面的内容的。不知道具体 api 。你可以用这个关键词去搜。

    可以问问做可视化的前端或者做 python 数分的。
    netnr
        22
    netnr  
       2022-05-05 17:18:49 +08:00
    @falcon05 #18 你可以对比一下
    zhangleshiye
        23
    zhangleshiye  
       2022-05-05 17:46:35 +08:00
    不是 如果不是实时性的 之间让后端弄个 redis 做缓存啊 存硬盘怎么失效呢
    haah
        24
    haah  
       2022-05-05 17:55:17 +08:00
    按照“日期范围”获取呀!一页一天不行么?
    potatowish
        25
    potatowish  
       2022-05-05 19:59:31 +08:00 via iPhone   1
    后端如果是 Java 可以考虑 ResponseBodyEmitter ,前端只需一次请求,后端每查询出一页数据就写入到响应,直到响应完成。并且服务端内存最多只需占用一页的数据。
    night98
        26
    night98  
       2022-05-05 21:19:50 +08:00
    websocket 或者 ssr ,你这需求一看就不靠谱,3 万数据正常屏幕平均十个点显示一个元素?抽样做吧,参考类似贝壳找房地图找房功能
    dcsuibian
        27
    dcsuibian  
       2022-05-05 21:46:11 +08:00
    楼上的学到了^_^
    最近正好也有做大量数据展示,我怎么就一直没想到分块查询的思路呢。。。
    dqzcwxb
        28
    dqzcwxb  
       2022-05-05 21:47:45 +08:00
    分页查询是利好前端的,你要是不想做后端巴不得不搞
    dcsuibian
        29
    dcsuibian  
       2022-05-05 22:05:59 +08:00
    没画过散点图,我这边 ECharts 画折线图,20000+数据也是秒画。卡顿主要是后台数据库查询了。

    你可以先试试看一次查询的,性能问题最忌讳虚空打靶。
    看看后端 Java 、数据库、网速、体积、内存、js 、ECharts 到底哪个占了最大头的部分。这样才能针对性优化。
    500 条数据感觉属实有点少了,跟 #13 说的至少加个 0 ,现在计算机的性能真的挺强、挺快的。

    再者说也不用等返回完了再画出来吧,如果每条数据是独立的,那完全可以有的部分先画出来。我记得 ECharts 对过渡动画和在线数据更新也支持得不错的。
    kiritoxf
        30
    kiritoxf  
    OP
       2022-05-06 09:48:29 +08:00
    感谢大家的回复,大家提出的建议都有参考价值。

    我的情景比较特殊,应该只有 5000 一次分页的可以用,因为所有的数据都取出来后还要跑另一个东西去算横纵坐标,但是试了下非常耗时间,得放弃这么做了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     886 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 20:16 PVG 04:16 LAX 13:16 JFK 16:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86