kiritoxf

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

  •  
  •   kiritoxf · May 5, 2022 · 4150 views
    This topic created in 1649 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

    现在确实算是内网,但是将来说不准,可能是为了考虑全面吧
    kiritoxf
    kiritoxf
    OP
    May 5, 2022
    17
    我现在打算用类似如下的伪代码来解决

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

    ```
    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
    GG668v26Fd55CP5W
    May 5, 2022❤️1
    18
    @netnr #11 web server 一般都可以配置根据 content-encoding: gzip 返回压缩后的内容,浏览器解压是也是自动的啊,为什么还要前端解压缩?
    rabbbit
    rabbbit
    May 5, 2022
    19
    @kiritoxf
    还是先别管后端咋传了,先搞个{ size: 999999999 }把数据展示出来再说.1 千万前端能撑住吗?
    内存装不下倒是有点扯
    jy02534655
    jy02534655
    May 5, 2022
    20
    echarts 本身是有配置支持大数据量优化的,至于怎么取数据上面已经说了
    itsme001
    itsme001
    May 5, 2022
    21
    散点图 点超过一定量 后浏览器端会卡的。具体是多少忘了,以前遇到过。
    没超过这个量让后端写个接口一次返回。
    超过这个量考虑
    1.做同含义的展示。后端做对应聚合。
    2.server side render ,后端根据前端传参直接返回 png 。
    这个问题 pyviz ,holoviz 有一篇文章写的很好。是关于大量数据展示的聚合、采样、渲染的。

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

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

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

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

    我的情景比较特殊,应该只有 5000 一次分页的可以用,因为所有的数据都取出来后还要跑另一个东西去算横纵坐标,但是试了下非常耗时间,得放弃这么做了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1008 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 18:48 · PVG 02:48 · LAX 10:48 · JFK 13:48
    ♥ Do have faith in what you're doing.