Suite

Comment utiliser le multitraitement ou le pool pour augmenter les performances du script ArcPy

Comment utiliser le multitraitement ou le pool pour augmenter les performances du script ArcPy


J'ai créé un script arcpy qui s'exécute lentement sur un énorme ensemble de données. comme 100000 fonctionnalité en elle. J'ai lu dans le chemin ci-dessous que le multitraitement peut augmenter les performances du script de script arcpy. http://blogs.esri.com/esri/arcgis/2011/08/29/multiprocessing/ Je l'ai essayé moi-même et je l'ai appliqué dans mon code.

Il donne une erreur "Could not find file: from multiprocessing.forking import main;main().mxd"

Je ne pouvais pas comprendre ce que signifie cette erreur et je n'ai pas pu obtenir de référence ou d'aide de la part d'une source Internet concernant l'erreur.

Vous trouverez ci-dessous le code qui trouve réellement les doublons dans une zone tampon proche (définie par l'utilisateur)

import arcpy import os import multiprocessing # définition de l'entrée inputFeatureClass = arcpy.GetParameterAsText(0) InputField = arcpy.GetParameterAsText(1) Distance = arcpy.GetParameterAsText(2) #vérifier si UNIID et le champ dup existent ou non, sinon l'ajouter à_add = ["UNIID","Dup"] #Créer une liste de noms de champs existants fieldList = arcpy.ListFields(inputFeatureClass) fieldName = [f.name pour f dans fieldList] pour le champ dans to_add : sinon champ dans fieldName : arcpy. AddField_management(inputFeatureClass,"UNIID","TEXT") arcpy.AddField_management(inputFeatureClass,"Dup","SHORT") #mise à jour du numéro de séquence en UNIID Field rows = arcpy.UpdateCursor(inputFeatureClass) counter = 1 for row in rows: row .UNIID = compteur rows.updateRow(row) counter += 1 #setting up progressor RowCount = arcpy.GetCount_management(inputFeatureClass) PACnt = int(RowCount.getOutput(0)) arcpy.SetProgressor("step", "Finding Duplicate… " ,0, PACnt, 1) def Find_dup(oid_range): i = oid_range[0] j = oid_range[1] lyr = arcpy .management.MakeFeatureLayer(inputFeatureClass, 'layer{0}'.format(i),"OID >= {0} AND OID <= {1}".format(i, j)) #sélectionner un point proche pour chaque point à l'intérieur searchcursor avec arcpy.da.SearchCursor(lyr, ["UNIID", InputField]) comme curseur : pour la ligne dans le curseur : value=row[0] field="UNIID" exp=field + "='" +value+"'" point_lyr=arcpy.SelectLayerByAttribute_management(lyr,"NEW_SELECTION",exp) arcpy.SelectLayerByLocation_management(point_lyr, superposition_type="WITHIN_A_DISTANCE", select_features=point_lyr, search_distance=Distance + " Mètres", selection_type="NEW_SELECTION") #pousser les points sélectionnés dans le tableau occurTwice = [] cursor = arcpy.da.SearchCursor (lyr, [InputField]) pour la ligne dans le curseur : occurTwice.append (row[0]) del curseur #comptage de l'occurrence de chaque valeur de champ à l'intérieur du tableau et mise à jour dans le curseur de champ dup = arcpy.da.UpdateCursor (lyr, [InputField, 'Dup']) pour la ligne dans le curseur : # vérifie si dup contient déjà une valeur en double, si oui, ne mettez pas à jour la valeur inférieure si se produitTwice.coun t(row[0]) > row[1]: row[1] = se produitTwice.count(row[0]) cursor.updateRow(row) del curseur del point_lyr arcpy.SetProgressorPosition() def main(): oid_ranges = [ [0, 1000],[1001, 2000], [2001, 3000], [3001, 4000], [4001, 5000],[5001, 6000], [6001, 7000], [7001, 8000], [8001 , 9000], [9001, 10001]] arcpy.env.overwriteOutput = True pool = multiprocessing.Pool(processes=4) pool.map(Find_dup, oid_ranges) pool.close() pool.join() if __name__ == ' __main__': main() #Supprimer le champ UNIID et tout désélectionner arcpy.DeleteField_management(inputFeatureClass,"UNIID") arcpy.SelectLayerByAttribute_management(inputFeatureClass,"CLEAR_SELECTION") arcpy.ResetProgressor()

Il semble que ce soit une limitation de l'environnement d'exécution ArcMaps. Citer JScheirer d'ESRI, qui explique plus en détail le problème dans le fil Problèmes du multiprocesseur Arcpy :

"Vous devrez exécuter votre script hors processus (il y a une case à cocher dans la boîte de dialogue des paramètres de l'outil de script) pour le faire fonctionner. ArcMap configure un environnement d'exécution qui peut ne pas être compatible avec la façon dont le multitraitement amorce son exécution. "