Tengo problemas con un cuello de botella de rendimiento al intentar actualizar muchos registros en dos tablas a la vez. Actualmente, tengo algunos Pandas DataFrames ( new_records_df y modified_records_df ) que contienen los registros que me gustaría insertar/actualizar. Ver el siguiente pseudocódigo:
if not new_records_df.empty: new_recs_data = new_records_df.T.to_dict().values() # creates a list of dictionaries from the DataFrame new_recs = [] for r in new_recs_data: new_rec = {'foo_id': foo_id, 'bar': bar} new_recs.append(new_rec) db_session.bulk_insert_mappings(Record, new_recs, return_defaults=True) # return_defaults inserts the id of the inserted record into the dictionary object new_related_recs = [] for nr in new_recs: new_related_rec = {'rec_id': nr['id'], 'baz': baz} new_related_recs.append(new_rec) db_session.bulk_insert_mappings(RelatedRec, new_related_recs) if not modified_records_df.empty: modified_rec_data = modified_records_df.T.to_dict().values() # again, converting teh DataFrame to a list of dicts modified_recs = [] for m in modified_rec_data: modified_rec = {'id': m['id'], 'zab': zab} modified_recs.append(modified_rec) db_session.bulk_update_mappings(RelatedRec, modified_recs) # when a record is modified, only the RelatedRec object is updated. The Record object already exists and stays unmodified el problema es que con ~8k registros, el bucle sobre los diccionarios toma ~20 segundos, mientras que la inserción/actualización real de la base de datos solo toma alrededor de 4 segundos. Esperaba que hubiera una forma inteligente de eliminar el bucle for , ya que este parece ser el cuello de botella. Mi base de datos es postgres y mi controlador es psycoppg2 2.6.2