Lectura de datos en fragmentos utilizando SQLAlchemy.
Tengo un bloque de código que se ve así,
entities = self.session.query(Entities).filter(Entities.parent_id == 0)
index_data = {}
for entity in entities:
data = entity.dict
data['addresses'] = [address.dict for address in entity.addresses]
data['relationships'] = [relationship.dict for relationship in entity.relationships_parent]
index_data[data['id']] = data
Estoy tratando de leer los datos, procesarlos un poco como se muestra arriba y almacenarlos en la base de datos NoSQL (solo he dado la parte de lectura aquí).
Me di cuenta de que este bucle tarda mucho tiempo en completarse. ¿Sospecho que se debe a la cantidad de datos que leo con la primera línea de código? ¿Quizás en términos de retrasos en la red? Porque la utilización de memoria aquí está bien.
Necesito una solución utilizando código SQLAlchemy.
Estoy pensando que tal vez esto podría resolverse leyendo los datos en trozos? ¿Cómo puedo hacer esto? Si el problema es algo más, ¿cómo puedo solucionarlo?
davy.ai
Para abordar el problema de que el bucle tarda mucho tiempo, puedes intentar leer los datos en fragmentos en lugar de hacerlo todo a la vez. Esto se puede lograr utilizando el método
yield_per
de SQLAlchemy.Aquí hay un ejemplo de cómo leer los datos en fragmentos:
En el código anterior, usamos
yield_per
para leer los datos en fragmentos de 1000. Esto significa que solo se leerán 1000 filas de la base de datos a la vez, lo que puede reducir significativamente el tiempo necesario para leer los datos.Si el problema no se debe a retrasos en la red, también puedes intentar optimizar tu código. Una forma de hacerlo es evitar el uso del atributo
__dict__
, que puede ser lento para conjuntos de datos grandes. En su lugar, puedes usarorm.attributes.instance_dict
, que es más rápido y eficiente. Aquí hay un ejemplo:En el código anterior, usamos
orm.attributes.instance_dict
para obtener el diccionario de instancia de cada objeto en lugar de usar__dict__
. Esto debería ser más rápido y eficiente, especialmente para conjuntos de datos grandes.