Freeze avec sqlalchemy (novice)
preliator13600
Messages postés
76
Statut
Membre
-
yg_be Messages postés 24281 Statut Contributeur -
yg_be Messages postés 24281 Statut Contributeur -
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.
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.
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:
- Freeze avec sqlalchemy (novice)
- Pc freeze - Guide
- Deep freeze - Télécharger - Sécurité
- Xbox 360 freeze ✓ - Forum Xbox 360
- Assassin's creed 1 freeze ✓ - Forum Jeux PC
- Device freeze - Forum Windows 7
2 réponses
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?
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?
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.
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.
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.
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.
moi j'essaierais de travailler avec une connexion, peut-être en la réouvrant à chaque département.
Hum... comment pourrais-je m'y prendre pour réouvrir une connexion à chaque département ?
Merci