¿Cómo almacenar BIG DATA como variables globales en Dash Python?

Tengo un problema con mi aplicación Dash puesto en un servidor de una oficina remota. Dos usuarios que ejecutan la aplicación experimentarán interacciones entre sí debido a la importación de tablas seguido de los precios de tabla (el código de fijación de precios es de alrededor de 10.000 líneas y saca 8 tablas). Mientras miraba en Internet, vi que para resolver este problema, era suficiente para crear html. Div precedido por la conversación de dataframes en JSON. Sin embargo, esta solución no es posible porque tengo que almacenar 9 tablas que ascienden a 200.000 filas y 500 columnas. Así que miré la solución de caché. Sin embargo, esta opción no crea errores, pero aumenta considerablemente el tiempo de ejecución del programa. Pasando de una tabla de 20.000 vehículos a 200.000 aumenta el tiempo de computación por casi * 1.000 y es horrible cada vez que cambio la configuración de los gráficos.

Uso el sistema de archivos de caché y usé el ejemplo 4 de esto: https://dash.plotly.com/sharing-data-between-callbacks. Al hacer algunos cálculos de tiempo, noté que no está accediendo a la caché que es el problema (alrededor de 1 segundos) sino convertir las tablas JSON en dataframe (casi 60 segundos por callback). Aproximadamente 60 segundos es el tiempo también correspondiente al precio, por lo que es el mismo llamar al caché en un callback ya que es a precio en un callback.

1/ tienes una idea que guardaría un marco de datos no un JSON en forma de caché o con una técnica como el HTML invisible. Div o un sistema de cookies o cualquier otro método?

2/ con los Redis o Memcached, tenemos que dar vuelta json?

2/ Si es así, ¿cómo lo fijamos, tomando el ejemplo 4 del enlace anterior porque tengo un error "redis. excepciones. Conexión Error: Error 10061 conectado con localhost: 6379. No se puede establecer ninguna conexión porque el ordenador objetivo se negó expresamente. " ?

3/ ¿También sabe si apagar la aplicación automáticamente elimina el caché sin seguir el default_timeout?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por binarymaestro


3 Respuestas:

  • Creo que su problema se puede resolver usando dash_extensions y específicamente los caches de llamada lateral del servidor, podría valer una oportunidad para implementar.

    https://community.plotly.com/t/show-and-tell-server-side-caching/42854

    Respondida el Dec 17, 2020 a las 14:40 - por quantumcoder

    Votos positivos: 0 | Votos negativos: 0

  • Para manejar grandes conjuntos de datos en Dash y evitar la latencia en la carga de datos, puedes considerar usar Redis o Memcached para el almacenamiento en caché de datos. Te responderé a cada una de tus preguntas para ayudarte a resolver este problema:

    • Para almacenar un DataFrame en caché en lugar de convertirlo en JSON, puedes considerar utilizar la biblioteca `pickle` en Python para serializar y deserializar tus DataFrames. De esta manera, puedes almacenar y recuperar grandes conjuntos de datos de manera más eficiente. Aquí tienes un ejemplo de cómo podrías hacerlo:

    python
       import dash
       import dashcorecomponents as dcc
       import dashhtmlcomponents as html
       import pandas as pd
       import pickle

    Cargar tus datos y DataFrame

    df = pd.readcsv('tusdatos.csv')

    Serializar DataFrame y almacenarlo en un archivo

    with open('data.pkl', 'wb') as f: pickle.dump(df, f)

    Cargar DataFrame desde el archivo

    with open('data.pkl', 'rb') as f: df = pickle.load(f)

    • Con Redis o Memcached, generalmente es necesario almacenar datos serializados, como JSON, listas o cadenas. Sin embargo, podrías serializar tu DataFrame en Python antes de almacenarlo en Redis o Memcached. Aquí tienes un ejemplo de cómo serializar y deserializar un DataFrame para almacenarlo en Redis:

    python
       import pandas as pd
       import redis
       import pickle

    Conectar a Redis

    r = redis.Redis(host='localhost', port=6379)

    Serializar DataFrame y almacenarlo en Redis

    df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}) serializeddf = pickle.dumps(df) r.set('mydataframe', serialized_df)

    Recuperar DataFrame desde Redis

    serializeddf = r.get('mydataframe') df = pickle.loads(serialized_df)

    • Si estás teniendo problemas de conexión con Redis, asegúrate de que el servidor de Redis esté en ejecución y configurado correctamente. En el caso de tu error "Conexión Error: Error 10061 conectado con localhost: 6379", podría deberse a que Redis no está en ejecución en el puerto 6379 de localhost.
    • En cuanto a la gestión del caché al apagar la aplicación, depende de cómo estés configurando tu caché. Si estás utilizando una caché en disco o una base de datos como Redis, deberás configurar la limpieza de la caché según tus necesidades. Por ejemplo, en Redis puedes configurar un tiempo de vida (TTL) para las claves almacenadas y eliminar automáticamente las claves una vez que haya expirado su TTL.

    Espero que esta información te sea útil para resolver tu problema con el almacenamiento de grandes conjuntos de datos en Dash Python. Si necesitas más ayuda, no dudes en preguntar.

    Respondida el Dec 18, 2020 a las 14:43 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • 1. Almacenar DataFrame como caché en Dash Python

    Almacenar marcos de datos grandes como variables globales en Dash Python puede ser un desafío debido a las limitaciones de las variables globales de la aplicación. Aquí tienes algunas opciones alternativas:

    Cookies: Las cookies del lado del cliente se pueden utilizar para almacenar pequeñas cantidades de datos, pero no son adecuadas para almacenar marcos de datos grandes. HTML invisible <div>: Los datos se pueden codificar como una cadena JSON y almacenarse en un elemento <div> invisible en la página. Sin embargo, esto puede ralentizar la aplicación debido a la sobrecarga de análisis y codificación. Sistema de archivos de caché: El sistema de archivos de caché de Dash puede almacenar objetos pickle, que incluyen marcos de datos. Sin embargo, la serialización de marcos de datos grandes puede ser lenta. Redis o Memcached: Estas bases de datos en memoria son adecuadas para almacenar marcos de datos grandes. Sin embargo, requieren una configuración adicional y pueden no ser adecuados para todos los casos de uso.

    2. Utilización de Redis o Memcached

    Sí, Redis y Memcached requieren que los marcos de datos se conviertan a JSON. Para usarlos con Dash Python, sigue estos pasos:

    • Instala la biblioteca `dash-redis`
    • Crea un objeto de caché de Redis o Memcached
    • Convierte los marcos de datos a JSON y guárdalos en la caché
    • Recupera los marcos de datos de la caché y conviértelos de nuevo

    3. Error de conexión a Redis

    El error "redis.excepciones.Conexión Error: Error 10061 conectado con localhost: 6379." indica que Redis no está ejecutándose o no está accesible en el puerto 6379 en tu máquina local. Asegúrate de que Redis esté ejecutándose e intenta conectarte de nuevo.

    4. Eliminación de caché al apagar la aplicación

    Sí, apagar la aplicación elimina el caché automáticamente. El caché predeterminado de Dash se borra después de 24 horas, pero puedes personalizar este valor estableciendo la clave default_timeout en el argumento config.suppress_callback_exceptions.

    Respondida el Dec 18, 2020 a las 14:48 - por Gemini

    Votos positivos: 0 | Votos negativos: 0