首页 > 解决方案 > Dash中的redis:达到最大递归级别

问题描述

我正在 Python 3.7 中构建 Dash 应用程序。具体来说,我想使用 redis 来预先计算整个图形,但得到一个错误“达到最大递归级别”。

我遵循官方 Dash 教程 ( https://dash.plot.ly/sharing-data-between-callbacks )的“示例 4”、“第 6 部分,在回调之间共享数据” 。但是,与该示例相反,我想预先计算的不是一些数据,而是整个图形。那是因为我收到了大型数据集——随着时间的推移的气象数据——由于它们的大小而加载非常缓慢,因此我想到了预先计算这个数字。无论如何,我可以在没有预计算部分的情况下构建应用程序,但是尝试修改它会从 Dash 引擎的深处抛出错误消息。

import os, sys, uuid
import dash_core_components as dcc
import dash_html_components as html
import dash
import plotly
from flask_caching import Cache
import pandas
import numpy

sys.setrecursionlimit(500000)   # doesn't help!

N = 50000   # big number

# start Dash application
app = dash.Dash(__name__)
cache = Cache(app.server, config={
    'CACHE_TYPE': 'redis',
    'CACHE_DIR': 'cache-directory',
    'CACHE_REDIS_URL': os.environ.get('REDIS_URL', 'redis://localhost:6379'),
    'CACHE_THRESHOLD': 10
})

def get_dataframe(session_id):
    @cache.memoize()
    def query_and_serialize_data(session_id):
        prep = pandas.DataFrame({
            'data': [plotly.graph_objs.Scattergl(
                x=[index for index in range(0, N)],   # time index
                y=numpy.random.rand(N),               # data points
                mode='lines+markers'
            )]
        })
        return prep.to_json()
    return pandas.read_json(query_and_serialize_data(session_id))

def serve_layout():
    session_id = str(uuid.uuid4())
    return html.Div([
        # hidden
        html.Div(session_id, id='session-id', style={'display': 'none'}),
        # graph
        html.Div([dcc.Graph(id='graph')])
    ])

app.layout = serve_layout

# update graph
@app.callback(
    dash.dependencies.Output('graph', 'figure'),
    [dash.dependencies.Input('session-id', 'children')])
def update_graph_figure(session_id):
    #data = [plotly.graph_objs.Scattergl(
    #    x=[index for index in range(0, N)],   # time index
    #    y=numpy.random.rand(N),               # data points
    #    mode='lines+markers'
    #)]                                        # valid data to 'graph'
    prep = get_dataframe(session_id)
    return {'data': prep['data']}

# main program
if __name__ == '__main__':
    app.run_server(debug=True)

错误消息遵循长调用列表:

回溯(最后一次调用):
文件“C:\ProgramData\Anaconda3\lib\site-packages\flask\app.py”,第 2309 行,调用中 返回 self.wsgi_app(environ, start_response)
...
文件“C :\ProgramData\Anaconda3\lib\site-packages\pandas\io\json\json.py”,第 161 行,在 _write iso_dates,default_handler)
文件“C:\ProgramData\Anaconda3\lib\site-packages\pandas\io \json\json.py",第 115 行,在 _write default_handler=default_handler
OverflowError: 达到最大递归级别

我应该如何更正代码?如果这个想法不起作用,我怎样才能以其他方式加快加载时间?

标签: pythonredisplotly-dash

解决方案


推荐阅读