There are two parts to my question.
First, when starting Dash app as shown in the demo script below, I want to store some dataframes to dcc.Store objects for processing later callbacks. But it seems like it takes a long time to load the dataframe first before loading the layout if the dataframe is big (like >10MB) . Is there any way to improve this?
Second, when I try to use to State(‘data’) of dcc.Store (like >10MB) in a callback, it takes a while to fire up the callback, especially when I set background=True to use with running and progress. In that case, isn’t the running argument supposed to start while the callback is working to note users that the process is running. In my script, it take a while for running argument to kick-in after clicking Show button, I have to wait for a while before the Spinner show up.
Demo script:
from dash import html,callback,DiskcacheManager,Dash,dcc,dash_table,ctx
import dash_bootstrap_components as dbc
from dash.dependencies import Input,Output,State
import pandas as pd
import diskcache
import time
cache = diskcache.Cache("./cache")
background_callback_manager = DiskcacheManager(cache)
app = Dash(__name__,
suppress_callback_exceptions=True,
external_stylesheets=[dbc.themes.CYBORG,
dbc.icons.BOOTSTRAP],
background_callback_manager=background_callback_manager)
server = app.server
df = pd.read_csv('https://covid19.who.int/WHO-COVID-19-global-data.csv')
app.layout = html.Div(
[dcc.Store(id="stored_data",data=df.to_dict('records')),
html.Br(),
dbc.Collapse([dbc.Row([dbc.Spinner(),
html.P("Processing...")]),
],
id="collapse_1",
is_open=False),
dbc.Button("Show",id="show_button"),
dbc.Button("Clear",id="clear_button"),
dash_table.DataTable(id='result')
])
@callback(Output("result","data"),
Output("result","columns"),
Input("show_button","n_clicks"),
Input("clear_button","n_clicks"),
State("stored_data","data"),
background=True,
running=[(Output("collapse_1","is_open"),True,False)],
prevent_initial_call=True,
)
def show_data_test(button1,button2,stored_data):
if ctx.triggered_id=="show_button":
df = pd.DataFrame(stored_data).head()
data = df.to_dict('records')
columns = [{"name": i, "id": i} for i in df.columns]
return data,columns
else:
time.sleep(1)
return None,None
if __name__ == '__main__':
app.run(debug=True)