Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于性能提升问题 #2125

Closed
pshta0 opened this issue Feb 10, 2023 · 8 comments
Closed

关于性能提升问题 #2125

pshta0 opened this issue Feb 10, 2023 · 8 comments

Comments

@pshta0
Copy link

pshta0 commented Feb 10, 2023

问题
求助!!!我是使用Python和Pyehcharts的新手!!在我准备生成的页面中使用较大数据量绘制折线图时,比如数十万个数据,渲染完毕后无论通过pyqt5的QWebEngine还是浏览器打开,在页面中操作dataZoom和进行其他拖动都会非常卡。因为我不希望丢失绝大多数有效数据,在查找pyecharts的官方文档并没有找到能改善性能的方法。 因为附件上传只有25mb,所以我上传了一个较小的文件,实际中的文件可能达到百兆左右。希望各位能帮助我这个菜鸟~~

运行环境(系统环境及 pyecharts 版本)
Python 3.7.4 32bits
pyecharts 2.0.1

代码及截图
23_02_10___10_47_01_render.txt

def page_add_line(self, signal_index):
    x_value_list = []
    y_value_list = []

    time_stamp_flag = 0
    xaxis_name ='TimeStamp'
    yaxis_type = 'value' 
    scale_flag = True
    marklineOpts= False
    formatterOpts = "{c}"

    for i, msd in enumerate(toolConfig.ALL_SIGNAL[signal_index][1:]):
        if time_stamp_flag == 1:
            x_value_list.append(i)
        else:
            try:
                float(msd['timestamp'])
                x_value_list.append(msd['timestamp'])
                xaxis_name ='TimeStamp'
            except:
                time_stamp_flag = 1
                x_value_list.append(i)
                xaxis_name ='SequenceNumber'
    msgAsig = toolConfig.ALL_SIGNAL[signal_index][0]
    msg = msgAsig[:msgAsig.index('_')]

    explain_dic = get_dbc_signal_explain(msg, get_dbc_signal(msg).index(msgAsig))
    max_signal_len = 0
    if explain_dic:
        yaxis_type = 'category'
        scale_flag = False        
        for msd in toolConfig.ALL_SIGNAL[signal_index][1:]:
            try:
                y_value = explain_dic[str(msd['value'])]
                y_value_list.append(y_value)
                signal_len = len(y_value)
                max_signal_len = max(max_signal_len,signal_len)
            except:
                y_value_list.append(float(msd['value']))      
        marklineOpts=False
        formatterOpts = "{c}"
        fontSize = 20 - int(max_signal_len*0.5) if 20 - int(max_signal_len*0.4)>10 else 10
        magin = 0
    else:
        yaxis_type = 'value' 
        scale_flag = True
        for msd in toolConfig.ALL_SIGNAL[signal_index][1:]:
            y_value_list.append(float(msd['value']))
        marklineOpts=opts.MarkLineOpts(
                        data=[opts.MarkLineItem(
                        type_="average", name="Average")]
                    )
        formatterOpts = "{c}"
        fontSize = 20
        magin = 5

    c = (
        Line()
        .add_xaxis(xaxis_data=x_value_list)
        .add_yaxis(series_name=toolConfig.ALL_SIGNAL[signal_index][0],
                   y_axis=y_value_list,
                   is_step=True,
                   markpoint_opts=opts.MarkPointOpts(
                                        data=[
                                            opts.MarkPointItem(type_="max", name="Max"),
                                            opts.MarkPointItem(type_="min", name="Min"),
                                        ]
                    ),
                    markline_opts=marklineOpts ,
                    label_opts=opts.LabelOpts(is_show=False,position='insideRight',rotate=20),
                    
                    
        )
        .set_global_opts(title_opts=opts.TitleOpts(title=toolConfig.ALL_SIGNAL[signal_index][0]),
                         toolbox_opts=opts.ToolboxOpts(
                             is_show=True),  
                         xaxis_opts=opts.AxisOpts(
                             type_='value', is_scale=True,min_interval=1,name=xaxis_name,name_location='end'),
                         yaxis_opts=opts.AxisOpts(
                             type_=yaxis_type, is_scale=scale_flag,min_interval=1,boundary_gap=False,
                             axistick_opts=opts.AxisTickOpts(is_show= True,is_inside=True),
                             axislabel_opts=opts.LabelOpts(is_show=True,position='insideRight',
                                                            rotate=0,font_size=fontSize,margin=magin,font_weight='bolder'
                             )
                         ),
                         tooltip_opts=opts.TooltipOpts(
                             is_show=True, trigger="item", formatter=formatterOpts),
                         datazoom_opts=[opts.DataZoomOpts(is_realtime=True,
                                                          is_show=True,
                                                          range_start=0,
                                                          range_end=100)]
        )
    )
    
    return c
@sunhailin-Leo
Copy link
Member

@pshta0

  • 可以试一下用 svg 渲染。

@pshta0
Copy link
Author

pshta0 commented Feb 20, 2023

@sunhailin-Leo 你好,尝试了使用SVG渲染,相比CANVAS,图表的变化得到了更慢的响应。这无法解决我的需求

@sunhailin-Leo
Copy link
Member

@pshta0

  • 那这个问题,我这边也没啥办法解决。毕竟渲染引擎在 Echarts 那边。pyecharts 只是用 python 封装 API 渲染 Echarts 的配置而已。

@pshta0
Copy link
Author

pshta0 commented Feb 20, 2023

@sunhailin-Leo 查询echarts的相关问题,有提到可以使用降采样等专门为大数据量渲染优化的策略,请问pyecharts是否有相关接口呢?

@sunhailin-Leo
Copy link
Member

@pshta0

  • 你指的是这种?
    image

@pshta0
Copy link
Author

pshta0 commented Feb 20, 2023

@sunhailin-Leo 是的,我注意到了这个,但我不清楚是否有效或者有其他更合适的优化策略

@sunhailin-Leo
Copy link
Member

@pshta0

  • 有部分图会有 large 的配置,但是 Line 没有。我可以给 Linesampling,等 2.0.2 Publish 之后你可以试试。

@pshta0
Copy link
Author

pshta0 commented Feb 20, 2023

@sunhailin-Leo 十分感谢你对项目的支持

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants