Suite

Liste des sources de données à l'aide d'arcpy : ListLayers très lent

Liste des sources de données à l'aide d'arcpy : ListLayers très lent


Ce que j'essaie de faire, c'est de créer une liste de toutes les sources de données dans un répertoire rempli de mxds. J'ai donc collé ce code ci-dessous. Pour une raison quelconque, la liste des couches peut prendre jusqu'à 50 minutes, même si le mxd n'a qu'environ 10 ou 15 couches. Est-ce un phénomène courant avec la méthode listlayers ?

avec open('data.csv', 'wb') comme fichier csv : fieldnames = ['File_Path', 'File_Size(MB)', 'Last_Edit', 'MXD_Version', 'Author', 'PageSize',  'XMAX' , 'XMIN', 'YMAX', 'YMIN', 'DATASOURCE'] #tous les champs d'en-tête writer = csv.DictWriter(csvfile, fieldnames = fieldnames) writer.writeheader() pour mapDocument dans findFiles(r"W:/GIS (pas de purge)", '*.mxd'): print mapDocument st = os.stat(mapDocument) print "Using ArcPY Mods… " mxd = arcpy.mapping.MapDocument(mapDocument) #using arcpy pour recueillir plus d'informations print "Reading Map Document… " writer.writerow({'File_Path' : str(mapDocument), 'File_Size(MB)' : str(((st[ST_SIZE])/1024.0)/1024.0),  'Last_Edit' : str(time .ctime(st[ST_MTIME])),  'MXD_Version' : getMXDVersion(mapDocument)}) print "Recherche de calques et écriture… " pour le calque dans arcpy.mapping.ListLayers(mxd): print "boop" si layer.supports( "DATASOURCE") : writer.writerow({'DATASOURCE' : layer.dataSource}) else : break del mxd

Donc, mon problème avec le code ci-dessus est lorsque je l'exécute. Il faudra une éternité pour accéder au 'imprimer " boop "'mais une fois qu'il y arrive, il fonctionne parfaitement bien. Il semble s'accrocher auarcpy.mapping.ListLayers(mxd)pendant très longtemps.

Parfois c'est génial, ça ne prend que quelques secondes, d'autres fois 8 minutes. C'est gérable, mais quand je laisse mon code s'exécuter toute la nuit et que certains d'entre eux prennent 50 minutes ou qu'il se bloque, c'est le problème (il s'est bloqué à cause d'une erreur de mémoire). Ces mxds n'ont pas non plus autant de couches.

Il n'y a généralement qu'un seul bloc de données contenant au plus 20 couches. Je peux ouvrir ces mxds moi-même et cela ne prend que quelques minutes au maximum.

D'après des tests plus poussés, cela ne semble pas non plus être lié à la quantité de couches. Il y avait quelques mxds qui avaient environ 30 couches qui ont été complétés en quelques secondes, puis quelques autres qui ont pris 4 heures (il y avait 44 couches) et il y en a qui avaient 30 couches et ont pris 50 minutes. Si je pouvais juste préciser pourquoi cela prend autant de temps, ce serait génial.


Tout d'abord, vérifiez votre script par rapport à un répertoire avec un mxd et une couche, pour vous assurer que le problème ne vient pas de la partie de votre script que vous n'avez pas publiée. Ensuite, vous devez modifier votre script pour tester d'autres propriétés "layer.supports" en plus de "dataSource". J'utilise la version ci-dessous :

pour lyr dans lyrList : dType = "UNK" dName = "UNK" dPath = "UNK" if lyr.supports("dataSource") : if lyr.supports("workspacePath") : dPath = lyr.workspacePath if lyr.supports( "datasetName") : dName = lyr.datasetName essayez : dType = arcpy.Describe(lyr.dataSource).datasettype sauf : dType = "Possible lien rompu" else : if lyr.isGroupLayer : dType = "Group Layer" si lyr.supports ("SERVICEPROPERTIES") : arcpy.AddMessage('Found map survice') dType = lyr.serviceProperties["ServiceType"]

Voir la vidéo: Python: Map Automation in ArcGIS Pro