Message posté par : Nicolas Kulpinski
----------------------------------------
Bonjour à tous,
Afin de continuer en français le sujet sur les problèmes de mémoire traité sur le site
ESRI.COM
https://community.esri.com/t5/python-questions/problem-with-arcpy-for-arcpr…
et parce qu'ils n'ont pas vraiment résolu ce problème, voici le mien.
Je dois faire une série d'itération (2209 exactement) avec une requête à chaque fois
pour pouvoir tester si les données correspondant à cette requête existe ou pas et si elle
existe, alors je fais un calcul sur la sélection.
Jusqu'ici rien de folichon, j'ai quand même réduit le nombre d'itération en
regroupant mes requêtes par famille.
Sans regroupement par famille, mon script n'arrive pas au bout et plante après plus de
10 heures de traitement.
Avec le regroupement le script va au bout mais comme l'a constaté le sujet en anglais,
il y a bien un ralentissement lorsqu'on utilise la fonction
arcpy.management.SelectLayerByAttribute dans une boucle qui a pour effet de passer les
requêtes de quelques milisecondes à quelques voire plusieurs longues secondes en fin de
parcour du tableau.
Un script qui devrait être exécuté en 10 à 15 minutes maxi prend plus d'une heure à
cause de ce BUG d'arcpy
Si vous avez des idées pour le contourner ?
Merci
-----------------
Code :
if option_zone == "true" :
env.workspace = (out_gdb_path)
analyzone = "ANALYZONE"
domName = "AnalyseDensite"
arcpy.CreateDomain_management(out_gdb_path, domName, "Analyse de densité",
"TEXT", "CODED")
arcpy.AddMessage("Creation du domaine AnalyseDensite")
domDict = {"D":"Densificaton", "N": "Pas de
changements", "L": "Libération de l'espace", "C":
"Changement de forme générale", "CD": "Changement de forme et
Densification", "CL": "Changement de forme et Libération de
l'espace"}
for codes in domDict:
arcpy.AddCodedValueToDomain_management(out_gdb_path, domName, codes,
domDict[codes])
arcpy.AddMessage("Creation des codes valeurs du domaine AnalyseDensite")
#Ajout du champ ANADENS
try :
arcpy.AddField_management(analyzone, "ANADENS", "TEXT",
"", "", 30, "Analyse de densification",
"NULLABLE", "")
arcpy.AddMessage("Ajout du champ ANADENS à la couche ANALYZONE")
except:
arcpy.AddMessage("Ajout IMPOSSIBLE du champ ANADENS à la couche
ANALYZONE")
arcpy.AssignDomainToField_management(analyzone, "ANADENS",
"AnalyseDensite")
######### ouverture et lecture du fichier
f=open(analyzone_csv,'r')
entete = f.readline().rstrip('\n\r')# Lit l'en-tete
entete_separee = entete.split(";")
ligne= f.readline() #soit f le pointeur vers votre fichier csv,
while ligne!='' : # soit tant que la ligne n'est pas vide
ligne = ligne.replace("\n","")
ligne_separee = ligne.split(";") # entre guillemet le separateur ici un
;
#couche de base
tabsize = len(ligne_separee)
for i in range(tabsize):
if (i>0):
code_base = ligne_separee [0]
code_base_fam = code_base[0:2]
code_evo = entete_separee
code_evo_fam = code_evo[0:2]
code_evo_detail = code_evo[-2:]
code_comp = ligne_separee
if (code_base_fam == code_evo_fam) :
sql_fdm = "FORMDOMI = '"+code_base+"' AND
FORMDOMI_1 = '"+code_evo+"'"
analyzone_select = arcpy.management.SelectLayerByAttribute(analyzone,
'NEW_SELECTION', sql_fdm)
arcpy.AddMessage("Selection dans ANALYZONE avec la requete
"+ sql_fdm)
#test pour savoir si la selection n'est pas vide
if int(arcpy.GetCount_management(analyzone_select)[0]) > 0:
arcpy.management.CalculateField(in_table=analyzone_select,
field="ANADENS", expression="'"+code_comp+"'",
expression_type="PYTHON3", code_block="", field_type="TEXT",
enforce_domains="NO_ENFORCE_DOMAINS")[0]
arcpy.AddMessage("Calcul du champ ANADENS avec la valeur
"+code_comp+"")
else :
arcpy.AddMessage("La selection est vide")
del analyzone_select
gc.collect()
else :
if (code_evo_detail == '00'):
sql_fdm = "FORMDOMI = '"+code_base+"' AND
FORMDOMI_1 LIKE '"+code_evo_fam+"%'"
analyzone_select =
arcpy.management.SelectLayerByAttribute(analyzone, 'NEW_SELECTION', sql_fdm)
arcpy.AddMessage("Selection de la famille
"+code_evo_fam+" dans ANALYZONE avec la requete "+ sql_fdm)
#test pour savoir si la selection n'est pas vide
if int(arcpy.GetCount_management(analyzone_select)[0]) > 0:
arcpy.management.CalculateField(in_table=analyzone_select,
field="ANADENS", expression="'"+code_comp+"'",
expression_type="PYTHON3", code_block="", field_type="TEXT",
enforce_domains="NO_ENFORCE_DOMAINS")[0]
arcpy.AddMessage("Calcul du champ ANADENS avec la valeur
"+code_comp+"")
else :
arcpy.AddMessage("La selection est vide")
del analyzone_select
gc.collect()
else :
arcpy.AddMessage("Requête traitée dans la famille
"+code_evo_fam+" précédente")
ligne= f.readline() #valeur de la ligne suivante
f.close()
-----------------
et voici le fichier csv parcouru par le script :
-----------------
Code :
xxxx;0000;0100;0101;0102;0103;0104;0105;0106;0107;0108;0109;0200;0201;0202;0203;0300;0400;0401;0402;0403;0404;0405;0406;0407;0500;0501;0502;0503;0600;0601;0602;0603;0604;0700;0701;0702;0703;0704;0705;0800;0801;0802;0900;0901;0902;0903;9900
0000;N;D;D;D;D;D;D;D;D;L;L;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0100;L;N;N;N;N;N;N;N;N;N;N;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0101;L;N;N;N;L;L;L;L;L;L;L;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0102;L;N;D;N;L;L;L;L;L;L;L;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0103;L;N;D;D;N;L;L;L;L;L;L;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0104;L;N;D;D;D;N;L;L;L;L;L;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0105;L;N;D;D;D;D;N;L;L;L;L;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0106;L;N;D;D;D;D;D;N;L;L;L;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0107;L;N;D;D;D;D;D;D;N;L;L;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0108;D;N;D;D;D;D;D;D;D;N;L;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0109;D;N;D;D;D;D;D;D;D;D;N;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0200;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0201;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0202;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0203;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;C;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0300;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;N;CL;CL;CL;CL;CL;CL;CL;CL;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0400;C;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;N;N;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0401;C;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;N;N;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0402;C;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;N;N;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0403;C;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;N;N;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0404;C;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;N;N;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0405;C;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;N;N;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0406;C;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;N;N;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0407;C;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;N;N;C;C;C;C;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0500;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0501;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0502;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0503;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;C;C;C;C;C;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0600;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;N;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0601;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;N;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0602;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;N;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0603;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;N;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0604;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;C;N;N;N;N;N;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;CL;N
0700;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;CL;CL;CL;C;C;C;C;N
0701;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;CL;CL;CL;C;C;C;C;N
0702;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;CL;CL;CL;C;C;C;C;N
0703;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;CL;CL;CL;C;C;C;C;N
0704;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;CL;CL;CL;C;C;C;C;N
0705;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;N;N;N;CL;CL;CL;C;C;C;C;N
0800;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;C;C;C;C;N
0801;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;C;C;C;C;N
0802;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;N;N;N;C;C;C;C;N
0900;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;C;C;C;C;C;C;C;C;C;N;N;N;N;N
0901;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;C;C;C;C;C;C;C;C;C;N;N;N;N;N
0902;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;C;C;C;C;C;C;C;C;C;N;N;N;N;N
0903;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;CD;C;C;C;C;C;C;C;C;C;N;N;N;N;N
9900;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N;N
-----------------
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=359183#p359183
Pour y répondre : esri_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net