Dash中的redis:达到最大递归级别

时间:2019-07-17 07:40:45

标签: python redis plotly-dash

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

我遵循官方Dash教程(https://dash.plot.ly/sharing-data-between-callbacks)的“示例4”,“第6部分,在回调之间共享数据”。但是,与该示例相反,我不想预计算某些数据,而是整个图形。那是因为我收到的大型数据集-随时间推移的气象数据-由于它们的大小而加载非常缓慢,因此我想到了预先计算该图的方法。无论如何,我可以构建不带precompute部分的应用程序,但是尝试对其进行修改会从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(环境,start_response)
  ...
    _write中的文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ json \ json.py”,第161行       iso_dates,default_handler)
    文件“ C:\ ProgramData \ Anaconda3 \ lib \ site-packages \ pandas \ io \ json \ json.py”,行115,_write       default_handler = default_handler
  OverflowError:达到最大递归级别

我应该如何纠正代码?如果这个想法行不通,该如何以其他方式加快加载时间?

0 个答案:

没有答案