Freeze avec sqlalchemy (novice)

preliator13600 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Sur une base de données Postgre, je dispose de 96 tables ("table1", "table2", "table3", etc) qui contiennent les bâtiments de la BD TOPO de l'IGN, tous départements mélangés. Je voudrais créer un programme python qui, en parcourant chacune de mes tables et en me basant sur le code Insee de chaque département, puisse créer une table par département (avec le nom du département associé au nom de la couche) qui contiendrait les bâtiments de ce derniers ("bati2A", "bati2B", "bati13", etc).

J'ai été très content d'avoir pu réaliser un programme fonctionnel ... qui malheureusement freeze de manière aléatoire. Voici mon code.

import pandas as pd
from sqlalchemy import create_engine
import time

engine = create_engine('postgresql://postgres:0000@localhost:5432/maison', echo=False)

print("---------EXTRACTION DES DEPARTEMENTS EN LISTE---------")
le_temps = time.time()
liste_query = engine.execute("select distinct left(insee_com, 2) from commune order by 1")
liste_df = pd.DataFrame(liste_query.fetchall())
liste_df.columns = ["col"]
liste = liste_df.col.unique()
print("Terminé en %s secondes" %(round(time.time() - le_temps, 2)))

for i in range(0, len(liste)):
 le_temps_begin = time.time()
 print("\n\n----------PREPARATION POUR DEPARTEMENT %s" %liste[i])
 engine.execute("create table if not exists bati_%s (id text, geom geometry, fid bigint, nature text, usage1 text, usage2 text, leger text, etat text, date_creat text, date_maj text, date_app text, date_conf text, source text, id_source text, prec_plani text, prec_alti text, nb_logts text, nb_etages text, mat_murs text, mat_toits text, hauteur text, z_min_sol text, z_min_toit text, z_max_toit text, z_max_sol text, origin_bat text, app_ff text, insee_com text, surface_m2 numeric, est_intersecte text );" %liste[i])
 for j in range(1, 96):   #96 CORRESPOND AU NOMBRE DE COUCHES QUI POSSEDENT LES BATIMENTS, TOUS DEPARTEMENTS MELANGES
  le_temps = time.time()
  print("\n----------PREPARATION POUR table_%s" %j)
  engine.execute("insert into bati_%s(id , geom , fid, nature , usage1 , usage2 , leger , etat , date_creat , date_maj , date_app , date_conf , source , id_source , prec_plani , prec_alti , nb_logts , nb_etages , mat_murs , mat_toits , hauteur , z_min_sol , z_min_toit , z_max_toit, z_max_sol , origin_bat , app_ff , insee_com , surface_m2, est_intersecte ) (select id , geom , fid, nature , usage1 , usage2 , leger , etat , date_creat , date_maj , date_app , date_conf , source , id_source , prec_plani , prec_alti , nb_logts , nb_etages , mat_murs , mat_toits , hauteur , z_min_sol , z_min_toit , z_max_toit, z_max_sol , origin_bat , app_ff , insee_com , surface_m2, est_intersecte  from public.table_%s where id not in (select id from bati_%s) and left(insee_com, 2) = '%s')" %(liste[i], j, liste[i], liste[i]))
  print("Terminé en %s secondes -- ELEMENT NUMERO %s" %(round(time.time() - le_temps, 2), i))
 print("\n\n--------------------DEPARTEMENT %s TERMINE EN %s SECONDES !!-------------------"%(liste[i], round(time.time() - le_temps_begin, 2)))


Je n'arrive pas à expliquer ce freeze. Par exemple, j'obtiens le message habituel "PREPARATION POUR table_18" (ligne 21), puis le programme bloque. Est-ce dû au trop grand nombre de requêtes ? Devrais systématiquement fermer la connexion puis la réouvrir ?

Merci.



Configuration: Windows / Chrome 88.0.4324.190
A voir également:

2 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
la bonne nouvelle, si je vois bien, c'est que, quand tu relances ton programme, il ne crée pas de doublon.
tu écris que le freeze se produit à des moments aléatoires.
est-ce réellement totalement aléatoire, ou bien cela varie-t-il d'une fois à l'autre?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
tu mentionnes "fermer la connexion", alors qu'en réalité, tu n'utilises pas explicitement de connexion.
moi j'essaierais de travailler avec une connexion, peut-être en la réouvrant à chaque département.
0
preliator13600 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Oui, ça me paraît aussi logique.
Hum... comment pourrais-je m'y prendre pour réouvrir une connexion à chaque département ?
Merci
0
preliator13600 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour ta réponse.

C'est assez difficile de juger si c'est vraiment aléatoire, mais prenons un cas concret.

Si je coupe le programme après le freeze (je quitte mon éditeur de texte + "Fin de tâche" sur tous les processus Python), il bloque systématiquement au même point.
Par contre, si je redémarre mon PC et que je relance le programme, il va toujours freeze mais quelques étapes plus loin.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
donc si tu redémarres le programme sans redémarrer le PC, il passe tous les départements déjà traités, puis toutes les tables déjà traitées pour le département en cours, puis se bloque sur la même table que précédemment?
as-tu essayé en arrêtant aussi les processus de PostgreSQL?
0
preliator13600 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Exactement.

Lorsque le programme freeze et que je quitte mon éditeur de texte, je remarque effectivement un processus "PostgreSQL" avec une haute consommation de RAM (il me fait monter la RAM à 50% d'utilisation, pour 64Go de RAM dans ma tour).

Si je quitte ce processus, j'obtiens le même effet qu'un redémarrage du PC, c'est-à-dire que je remarque une petite progression en relançant le programme, mais il se freeze quand même au bout d'un moment.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > preliator13600 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention  
 
je suggère de d'abord essayer de fermer/rouvrir l'engine avant chaque INSERT.
ensuite, essayer en utilisant Psycopg2 au lieu de sqlalchemy.
0
preliator13600 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Un grand merci pour tes conseils. J'ai adapté mon code sur Psycopg2 et (je touche du bois) aucun problème pour les 60 autres départements. Psycopg2 serait donc plus efficace que sqlalchemy d'une manière générale ?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > preliator13600 Messages postés 67 Date d'inscription   Statut Membre Dernière intervention  
 
aucune idée, comme tu étais coincé il fallait bien essayer d'autres options.
0