Please activate JavaScript!
Please install Adobe Flash Player, click here for download

arcAKTUELL 1.2013 - Leben in der Stadt

48 T I P P S U N D T R I C K S try: number_of_processes = multiprocessing.cpu_ count() ## Liste der Argumente für jeden Job definie- ren… args_list = [] for i in range(number_of_jobs): args = … args_list.append(args) pool = multiprocessing .Pool(number_of_proces- ses) pool.map(worker, args_list) pool.close() pool.join() except arcpy.ExecuteError: arcpy.AddMessage (arcpy.GetMessages(2)) return except Exception as e: arcpy.AddMessage (e.args[0]) return Die Funktion map des Pools steuert automatisch die Erzeugung der Prozesse, den Aufruf der Funktion und die Zuweisung der Argumente zu jedem einzelnen Prozess. Es werden maximal so viele Prozesse gleichzeitig erzeugt, wie man bei der Initialisierung des Pool-Objekts angegeben hat (idealerweise die Anzahl der verfügbaren CPUs). Die Implementierung der Worker-Funktion entspricht dann dem Multipro- cessing.Process-Szenario. Ein Debugging ist nicht möglich. Darum ist es wichtig, dass sowohl der Gesamtprozess als auch alle anderen Prozesse sinnvoll und aussage- kräftig loggen. Das Logging-Modul in Python bietet dafür gute Unter- stützung – die Übergabe einer eindeutigen Prozess- oder Jobnummer (pid) in den Argumenten ist für die spätere Zuordnung einer Log-Datei zu einem Job hilfreich: def worker(arguments): arg_list = eval(arguments) pid = arg_list[0] logging.basicConfig(level=logging.DEBUG, format=‘%(asctime)s %(name)-12s %(levelname)-8s %(message)s‘, datefmt=‘%m-%d %H:%M‘, filename=r‘C:\temp\process_‘+ pid + ‚.log‘, filemode=‘w‘) logging.info(arguments) try: env.overwriteOutput = True ### .... logging.info(„ finished“) except arcpy.ExecuteError: logging.error(„arcpy failed „ + arcpy.GetMessa- ges(2)) except Exception as e: logging.error(„python failed „ + e.args[0]) Folgende Grafik veranschaulicht zum Schluss noch einmal die mögliche Zeitersparnis durch Multiprocessing bei der Ausführung eines Geoverar- beitungsmodells. Die Ausführung eines Testmodells komplett über den gesamten Testdatenbestand direkt in ArcCatalog dauerte 80 Minuten. Durch ein regelmäßiges Gitter wurden die Testdaten in 16 Portionen aufgeteilt und gleichzeitig mit vier Prozessen (Multiprocessing.Pool-Im- plementierung) verarbeitet (bei vier verfügbaren CPUs): Die einzelnen Prozesse (jeder Prozess verarbeitete zwischen zwei und sechs Jobs) dauerten zwischen 31 und 35 Minuten. Der gesamte Pro- zess (Aufteilen der Daten in Jobs – Verarbeitung der Jobs durch die Prozesse – Zusammenführen aller Ergebnisse) benötigte 38 Minuten – dies war also immerhin doppelt so schnell wie die Ausführung des ge- samten Testdatenbestands mit nur einem Prozess. Templates für die oben beschriebenen Implementierungen gibt es auf ArcGIS Online zum Download. Suchen Sie mit den Begriffen Python, Thread, Multiprocessing, Template oder verwenden Sie folgenden Link: http://www.arcgis.com/home/item.html?id=fbdc5324a3ba4807beb72a 97c4bf1a39 Jochen Manegold Esri Deutschland GmbH Kranzberg ++ TIPPS UND TRICKS FÜR ANWENDER

Seitenübersicht