我正在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:达到最大递归级别
我应该如何纠正代码?如果这个想法行不通,该如何以其他方式加快加载时间?