Einführung
Die Einführung von Python 2.6 mit dem multiprocessing-Modul in ArcGIS-Produkten begann mit ArcGIS 10.0 (Inlandsveröffentlichung: 22. Oktober 2010). Seitdem wurde das Thema auch in Esri-Blogs behandelt, die in den USA veröffentlicht werden,Python Multiprocessing – Ansätze und Überlegungen (August 2011),Multiprocessing mit ArcGIS – Ansätze und Überlegungen (Teil 1): September 2012und als Einstieg in die Mehrprozessverarbeitung behandelt. In den letzten Jahren wurde das Thema auch auf der Esri Developer Summit, bei der viele Entwickler weltweit zusammenkommen,Parallel Python: Multiprocessing mit ArcPy: Video vom März 2017,Vector- und Raster-Multiprocessing mit ArcPy: Video vom März 2018als technische Sessions vorgestellt.
Mehrprozessverarbeitung
ArcGIS Pro ArbeitsumgebungMit der Verbreitung von Hochleistungshardware (64-Bit-Betriebssysteme als Standard, Empfehlung von mindestens 4 CPU-Kernen und optimalerweise mehr als 16 GB RAM) in ArcGIS Pro steigt auch die Datenmenge, die für Analyse und Verarbeitung verwendet wird, sprunghaft an. Effiziente Analyse- und Verarbeitungsmethoden sind daher weiterhin notwendig.
Vor diesem Hintergrund möchte ich diesmal die Erweiterungsmöglichkeiten der ArcGIS-Plattform vorstellen, indem ich die Mehrprozessverarbeitung mit ArcPy und Python erläutere und dabei wichtige Implementierungspunkte und Codierungsmuster anhand von Beispielen vorstelle.
Für die praktische Codierung empfehle ich, sich zunächst die zugehörigen Informationen anzusehen und den Code selbst auszuprobieren. Ich hoffe, dass dieser Artikel als Referenz dient, um Implementierungspunkte für parallele Verarbeitung zu verstehen und diese erfolgreich in Ihre aktuellen Workflows einzubinden.
Best Practices
In den zugehörigen Informationen wird multiprocessing mit ArcPy und Python als Best Practice beschrieben, wobei Folgendes hervorgehoben wird:
- Um Ergebnisse temporär zu speichern und eine schnelle Ausführung zu gewährleisten, wird empfohlen,den in_memory-Arbeitsbereich zu verwenden.
- File Geodatabase (Referenz:Überblick über File Geodatabase) sowie das Schreiben in GRID-Raster sollten vermieden werden.
Diese Datenformate können Probleme wie Sperrkonflikte oder Synchronisationsprobleme verursachen. Dies liegt daran, dass File Geodatabases und GRID-Raster nicht gleichzeitig Schreibzugriffe unterstützen. Das bedeutet, dass jeweils nur ein Prozess schreiben kann. Wenn Sie versuchen, eine Feature-Class aus einer mit ArcGIS geöffneten Datei in ArcPy zu ändern, treten diese Probleme auf. Außerdem vergrößert sich das Problem, wenn Sie versuchen, mehrere Feature-Classes gleichzeitig in einer File Geodatabase zu schreiben. Selbst wenn alle Feature-Classes unabhängig existieren, kann jeweils nur eine Feature-Class innerhalb der File Geodatabase gleichzeitig beschrieben werden.
- Für die Skriptausführung sollte eine 64-Bit-Python-Ausführungsumgebung verwendet werden.
Ab ArcGIS Pro 1.4 oder ArcGIS Server 10.5 bzw. bei Installation von Background Geoprocessing (64-bit) für ArcGIS Desktop 10.5 oder höher kann eine 64-Bit-Python-Ausführungsumgebung genutzt werden. Die 64-Bit-Ausführungsumgebung kann Probleme lösen, die durch Speicherbeschränkungen (4 GB) der 32-Bit-Version entstehen, insbesondere bei großen Datenmengen. Bei der Implementierung ist besonders auf die Verwendung von File Geodatabases zu achten. Mindestens sollten Sie vermeiden, dieselbe File Geodatabase in mehreren Prozessen gleichzeitig zu beschreiben. Stattdessen können Sie Masterfunktionen verwenden, um mehrere Schemata oder einzelne File Geodatabases zu einer einzigen Quelle zusammenzuführen.
* Eine Möglichkeit ist es auch, Entwurfs-Geodatabases als Schreibziel aus mehreren Prozessen heraus über Worker-Funktionen zu verwenden.
Beispiel für Mehrprozessverarbeitung
Das Beispiel enthält mehrere Schemaprozessdateien unterhalb des Ordners für alle 47 Präfekturen Japans. Nach Erstellung der File Geodatabase-Datenbanken für jede Präfektur wird jeweils ein Schema-Code implementiert, der diese in die jeweilige Feature-Class konvertiert. Der Implementierungspunkt ist wie im obigen Best-Practice-Beispiel beschrieben so gestaltet, dass beim Schreiben in die File Geodatabase ein Lock gesetzt wird mit dem Kommentar „Schreiben des Schemaprozesses für eine Präfekturdatei entspricht dem Schreiben in eine Feature-Class innerhalb einer einzelnen File Geodatabase“.
Sehen wir uns den Codierungsablauf an.
1) Worker-Funktion: batch_convert
Als Codierungsablauf wird zunächst die Worker-Funktion ähnlich wie bei regulären ArcPy-Verarbeitungen geschrieben. Dabei ist wichtig zu beachten, dass diese Worker-Funktion einer Prozessinstanz entspricht und bei Bedarf Entwurfs-Geodatabases verwendet werden sollten oder darauf geachtet werden muss, dieselbe File Geodatabase nicht gleichzeitig zu verwenden.
<SPAN class="keyword token">def</SPAN> <SPAN class="token function">batch_convert</SPAN><SPAN class="punctuation token">(</SPAN>inws<span class="punctuation token">,</span> outws<span class="punctuation token">)</span><span class="punctuation token">:</span>
<SPAN class="string token">'''
Verarbeitung zur Ausführung durch einen Prozess (Worker-Funktion):
Da das Schreiben in eine File Geodatabase nicht durch mehrere Prozesse gleichzeitig erfolgen kann,
- mehrere Schemaprozessdateien unter einem Ordner für eine Präfekturdatei
- Umwandlung in mehrere Feature-Classes unter einer File Geodatabase für eine Präfekturdatei
'''</SPAN>
<SPAN class="comment token">#print("Konvertierung: {0} 12 {1}\n".format(inws,outws))</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="operator token">not</SPAN> arcpy<span class="punctuation token">.</span>Exists<span class="punctuation token">(</span>outws<span class="punctuation token">)</span><span class="punctuation token">:</span>
outfolder<span class="operator token">=</span>os<span class="punctuation token">.</span>path<span class="punctuation token">.</span>dirname<span class="punctuation token">(</span>outws<span class="punctuation token">)</span>
foldername<span class="operator token">=</span>os<span class="punctuation token">.</span>path<span class="punctuation token">.</span>basename<span class="punctuation token">(</span>outws<span class="punctuation token">)</span>
arcpy<span class="punctuation token">.</span>CreateFileGDB_management<span class="punctuation token">(</span>outfolder<span class="punctuation token">,</span>foldername<span class="punctuation token">,"CURRENT"</span><span class="punctuation token">)</span>
arcpy<span class="punctuation token">.</span>env<span class="punctuation token">.</span>workspace <span class="operator token">=</span> inws
fcs <span class="operator token">=</span> arcpy<span class="punctuation token">.</span>ListFeatureClasses<span class="punctuation token">()</span>
<SPAN class="keyword token">for</SPAN> fc <SPAN class="keyword token">in</SPAN> fcs<span class="punctuation token">:</span>
l<span class="operator token">=</span>len<span class="punctuation token">(</span>fc<span class="punctuation token">)</span>
infc<span class="operator token">=</span>os<span class="punctuation token">.</span>path<span class="punctuation token">.</span>splitext<span class="punctuation token">(</span>fc<span class="punctuation token">)[0]</span>
<SPAN class="comment token"># Ändern des Namens der letzten vier Zeichen des Namens der Feature-Class</SPAN>
<SPAN class="comment token"># Beispiel) P101_CITY.shp → P0101_CITY</SPAN>
newfc <span class="operator token">=</span> fc[:1]+fc[1:l-4].zfill(4)
<SPAN class="comment token"># Wenn die Feature-Class bereits existiert: Append</SPAN>
<SPAN class="comment token"># Wenn sie nicht existiert: FeatureClassToFeatureClass</SPAN>
<SPAN class="keyword token">wenn</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>Exists<SPAN class="punctuation token">(</SPAN>os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>outws<SPAN class="punctuation token">,</SPAN>newfc<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">:</SPAN>
outfc<SPAN class="operator token">=</SPAN>os<SPAN class="punctuation token">.</SPAN>path<SPAN class="punctuation token">.</SPAN>join<SPAN class="punctuation token">(</SPAN>outws<SPAN class="punctuation token">,</SPAN>newfc<SPAN class="punctuation token">)</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>Append_management<SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN>outfc<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">sonst</SPAN><SPAN class="punctuation token">:</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>FeatureClassToFeatureClass_conversion<SPAN class="punctuation token">(</SPAN>fc<SPAN class="punctuation token">,</SPAN>outws<SPAN class="punctuation token">,</SPAN>newfc<SPAN class="punctuation token">)</SPAN>
<SPAN class="keyword token">del</SPAN> fcs
<SPAN class="keyword token">return</SPAN> <SPAN class="string token">" Umwandlungsziel: {0}"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAN class="punctuation token">(</SPAN>outws<SPAN class="punctuation token">)</SPAN>
<SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></PAN><PAN><EMOJI_12></PAN><PAN><EMOJI_13></PAN><PAN><EMOJI_14></PAN><PAN><EMOJI_15></PAN><PAN><EMOJI_16></PAN><PAN><EMOJI_17></PAN><PAN><EMOJI_18></PAN><PAN><EMOJI_19></PAN><PAN><EMOJI_20></PAN><PAN><EMOJI_21></PAN><PAN><EMOJI_22></PAN><PAN><EMOJI_23></PAN><PAN><EMOJI_24></PAN><PAN><EMOJI_25></PAN><PAN><EMOJI_26></PAN><PAN><EMOJI_27></PAN><PAN><EMOJI_28></PAN><PAN><EMOJI_29></PAN><PAN><EMOJI_30></PAN><PAN><EMOJI_31></PAN><PAN><EMOJI_32></PAN></span>
2) Worker-Funktion Wrapper: multi_run_batch_convert
Wenn Sie eine Worker-Funktion aus einem Multiprozess aufrufen, ist es nicht erforderlich, einzelne Argumente anzugeben. Wenn jedoch mehrere Argumente übergeben werden müssen, ist die Verwendung einer Wrapper-Funktion praktisch.
<span class="keyword token">def</span> <span class="token function">multi_run_batch_convert</span>(args)<span class="punctuation token">:</span>
<span class="string token">'''
Wrapper für batch_convert:
Wrapper zum Übergeben mehrerer Argumente an die Ausführungsfunktion
'''</span>
<span class="keyword token">return</span> batch_convert<span class="punctuation token">(*</span>args<span class="punctuation token">)</span><<EMOJI_33><span class="line-numbers-rows"><span><<EMOJI_34></span><span><<EMOJI_35></span><span><<EMOJI_36></span><span><<EMOJI_37></span><span><<EMOJI_38></span><span><<EMOJI_39></span></span>
3) Multiprozess-Verarbeitung: exec_batch_convert
Zwei Argumente (inws, outws) werden als Liste params an die Worker-Funktion übergeben.
Danach,
pool = multiprocessing.Pool(cpu_cnt) wird verwendet, um den Pool zu erstellen.
results = pool.map(multi_run_batch_convert , params) wird ausgeführt.
Erstes Argument: Name der zu verarbeitenden Worker-Funktion (hier multi_run_batch_convert)
Zweites Argument: Liste der Parameter params
<span class="keyword token">def</span> <span class="token function">exec_batch_convert</span>(infolder<span class="punctuation token">,</span> outfolder)<span class="punctuation token">:</span>
<span class="string token">'''
Verarbeitung mit Multiprozess (Master-Funktion):
'''</span>
<span class="keyword token">try</span>:
start = datetime.datetime.now()
<span class="keyword token">print</span> "-- Start: Multiprocess_ShapefileToFeatureClassWithRename --:", start
cpu_cnt = multiprocessing.cpu_count()
arcpy.env.workspace = infolder
inwss = arcpy.ListWorkspaces("*","Folder")
<span class="comment token"># Parameter für jede Prozessinstanz als Liste vorbereiten</span>
params = []
<span class="keyword token">für</span> inws <span class="keyword token">in</span> inwss:
param1 = inws <span class="comment token"># Präfekturordner (enthält Shapefiles)</span>
gdbname = "{0}.gdb".<span class="punctuation token">format(</span>os.path.basename(inws)<span class="punctuation token">)</span>
param2 = os.path.join(outfolder, gdbname) <span class="comment token"># Präfektur-Dateigeodatabase-Ordner</span>
params.append((param1,param2))
<span class="keyword token">wenn</span> len(inwss) < cpu_cnt: <span class="comment token"># Wenn weniger Prozessordner als CPU-Kerne vorhanden sind, ist kein unnötiger Prozessstart nötig</span>
cpu_cnt = len(inwss)
pool = multiprocessing.Pool(cpu_cnt) <span class="comment token"># Erstelle Python-Prozesse entsprechend der CPU-Anzahl</span>
results = pool.map(multi_run_batch_convert, params) <span class="comment token"># Prozesse werden nacheinander mit den zugewiesenen Parametern ausgeführt</span>
pool.close()
pool.join()
<span class="comment token"># Ausgabe der Ergebnisse jeder Prozessinstanz</span>
<span class="keyword token">für</span> r <span class="keyword token">in</span> results:
<span class="keyword token">print(</span>r<span class="punctuation token"> )</span>
<span class="comment token"># Zusammenführung der Feature-Classes innerhalb der Präfektur-Dateigeodatabases nach Ordnern sortiert</span>
<span class="comment token"># Für die Erstellung einer landesweiten Version hier eintragen</span>
<span class="comment token"># ~省略~</span>
fin<SPAN class="operator token">=<\/SPAN>datetime<SPAN class="punctuation token">.<\/SPAN>datetime<SPAN class="punctuation token">.<\/SPAN>now<SPAN class="punctuation token">(<\/SPAN><SPAN class="punctuation token">)<\/SPAN>
<SPAN class="keyword token">print<\/SPAN> <SPAN class="string token">"-- Fertig: Multiprocess_ShapefileToFeatureClassWithRename --:"<\/SPAN><SPAN class="punctuation token">,<\/SPAN>fin
<SPAN class="keyword token">print<\/SPAN> <SPAN class="string token">" Verstrichene Zeit:"<\/SPAN><SPAN class="punctuation token">,<\/SPAN> fin<SPAN class="operator token">-<\/SPAN>start
<SPAN class="keyword token">except<\/SPAN><SPAN class="punctuation token">:<\/SPAN>
<SPAN class="keyword token">print<\/SPAN> traceback<SPAN class="punctuation token">.<\/SPAN>format_exc<SPAN class="punctuation token">(<\/SPAN>sys<SPAN class="punctuation token">.<\/SPAN>exc_info<SPAN class="punctuation token">(<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="punctuation token">[<\/SPAN><SPAN class="number token">2<\/SPAN><SPAN class="punctuation token">]<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="line-numbers-rows"><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/Span ><Span ><Span ><Span ><Span ><Span ><Span ><Span ><Span ><Span ><Span ><Span ><Span ><Span ><Span >
Beispielcode der fertigen Version
Basierend auf den oben genannten Codierungsmustern wurde das Python-Skript (Multiprocess_Sample.py) implementiert. Ändern Sie infolder und outfolder entsprechend Ihrer Umgebung und führen Sie es aus der Python-Ausführungsumgebung aus, um die Datenkonvertierung mit Multiprozess durchzuführen.
<span class="comment token">#coding:cp932</span>
<span class="keyword token">import</span> arcpy<span class="punctuation token">,</span>os
<span class="keyword token">import</span> sys
<span class="keyword token">import</span> multiprocessing
<span class="keyword token">import</span> datetime
<span class="keyword token">import</span> traceback
reload<span class="punctuation token">(</span>sys<span class="punctuation token">)</span>
sys<span class="punctuation token">.</span>setdefaultencoding<span class="punctuation token">(</span>'cp932'<span class="punctuation token">)</span>
<span class="keyword token">def</span> <span class="token function">multi_run_batch_convert</span><span class="punctuation token">(</span>args<span class="punctuation token">):</span>
<span class="string token">'''
Wrapper für batch_convert:
Ein Wrapper, um mehrere Argumente an die parallele Verarbeitung zu übergeben
'''</span>
<span class="keyword token">return</span> batch_convert<span class="punctuation token">(*</span>args<span class="punctuation token">)</span>
<span class="keyword token">def</span> <span class="token function">batch_convert</span><span class="punctuation token">(</span>inws<span class="punctuation token">,</span> outws<span class="punctuation token">):</span>
<span class="string token">'''
Verarbeitung, die in einem Prozess ausgeführt wird (Worker-Funktion):
Da das Schreiben von Dateien in eine Geodatabase nicht mit mehreren Prozessen möglich ist,
werden mehrere Shapefile-Dateien unterhalb eines Präfekturordners verarbeitet,
und mehrere Feature-Class-Dateien unterhalb der Geodatabase des Präfekturordners umbenannt,
wie beschrieben.
'''</span>
<span class="comment token">#print("Konvertierung: {0} 12 {1}\n".format(inws,outws))</span>
<span class="keyword token">if</span> <span class="operator token">not</span> arcpy<span class="punctuation token">.</span>Exists<span class="punctuation token">(</span>outws<span class="punctuation token">):</span></span></font></p>
<p style='margin-top:0;margin-bottom:0;'> outfolder<span class='operator'>=</span>os<span class='punctuation'>.</span>path<span class='punctuation'>.</span>dirname<span>(outws)</span></p>
<p style='margin-top:0;margin-bottom:0;'> foldername<span>=</span>os<span>.</p>
<p style='margin-top:0;margin-bottom:0;'>path.basename(outws)</p>
<p style='margin-top:0;margin-bottom:0;'> arcpy.CreateFileGDB_management(outfolder,foldername,"CURRENT")
arcpy.env.workspace = inws
fcs = arcpy.ListFeatureClasses()
for fc in fcs:
l=len(fc)
infc=os.path.splitext(fc)[0]
# 0 eingebettete 4-stellige Zahl im Namen ändern
# z.B. P101_CITY.shp 12 P0101_CITY
newfc = fc[:1]+fc[1:l-4].zfill(4)
# Wenn Feature-Class bereits existiert, dann Append
# Wenn nicht vorhanden, dann FeatureClassToFeatureClass
if arcpy.Exists(os.path.join(outws,newfc)):
outfc=os.path.join(outws,newfc)
arcpy.Append_management(fc,outfc)
else:
arcpy.FeatureClassToFeatureClass_conversion(fc,outws,newfc)
del fcs
return " Konvertierung abgeschlossen: {0}".format(outws)
outfolder = os.path.dirname(outws)
foldername = os.path.basename(outws)
arcpy.CreateFileGDB_management(outfolder, foldername, "CURRENT")
arcpy.env.workspace = inws
fcs = arcpy.ListFeatureClasses()
for fc in fcs:
l = len(fc)
infc = os.path.splitext(fc)[0]
# Ändere den eingebetteten 4-stelligen Zahlenteil im Namen der Feature-Class
# Beispiel) P101_CITY.shp → P0101_CITY
newfc = fc[:1] + fc[1:l-4].zfill(4)
# Wenn die Feature-Class bereits existiert, dann Append verwenden
# Wenn nicht vorhanden, dann FeatureClassToFeatureClass verwenden
if arcpy.Exists(os.path.join(outws, newfc)):
outfc = os.path.join(outws, newfc)
arcpy.Append_management(fc, outfc)
else:
arcpy.FeatureClassToFeatureClass_conversion(fc, outws, newfc)
del fcs
return " Konvertierung abgeschlossen: {0}".format(outws)
<span class='keyword'>def</span> exec_batch_convert(infolder, outfolder):
'''
Verarbeitung mit Multiprozess (Master-Funktion):
'''
<SPAN class="keyword token">try</SPAN><SPAN class="punctuation token">:</SPAN>
start<SPAN class="operator token">=</SPAN>datetime<SPAN class="punctuation token">.</SPAN>datetime<SPAN class="punctuation token">.</SPAN>now<SPAN class="punctuation token">()</SPAN>
<SPAN class="keyword token">print</SPAN> <SPAN class="string token">"-- Start: Multiprocess_ShapefileToFeatureClassWithRename --:"</SPAN><SPAN class="punctuation token">,</SPAN>start
cpu_cnt<SPAN class="operator token">=</SPAN>multiprocessing<SPAN class="punctuation token">.</SPAN>cpu_count<SPAN class="punctuation token">()</SPAN>
arcpy<SPAN class="punctuation token">.</SPAN>env<SPAN class="punctuation token">.</SPAN>workspace <SPAN class="operator token">=</SPAN> infolder
inwss <SPAN class="operator token">=</SPAN> arcpy<SPAN class="punctuation token">.</SPAN>ListWorkspaces<SPAN class="punctuation token">("*","Folder")</SPAN>
<SPAN class="comment token"># Parameter, der an jeden Prozess übergeben wird, als Liste</SPAN>
params<SPAN class="operator token">=</SPAN><SPAN class="punctuation token">[]</SPAN>
<SPAN class="keyword token">for</SPAN> inws <SPAN class="keyword token">in</SPAN> inwss<SPAN class="punctuation token">:</SPAN>
param1<SPAN class="operator token">=</SPAN>inws <SPAN class="comment token"># Präfekturordner (enthält Shapefiles)</span>
gdbname<SPAN class="operator token">=</SPAN><SPAN class="string token">"{0}.gdb"</SPAN><SPAN class="punctuation token">.</SPAN>format<SPAn class="punctuation token">(</SPAn>os<SPAn class="punctuation token">.</SPAn>path<SPAn class="punctuation token">.</SPAn>basename<SPAn class="punctuation token">(</SPAn>inws<SPAn class="punctuation token">)</SPAn><SPAn class="punctuation token">)</SPAn></span>
param2<SPAn class="operator token">=</SPAn>os<SPAn class="punctuation token">.</SPAn>path<SPAn class="punctuation token">.</SPAn>join<SPAn class="punctuation token">(</SPAn>outfolder<SPAn class="punctuation token">,</SPAn>gdbname<SPAn class="punctuation token">)</SPAn> <span class="comment token"># Zielordner für Präfekturdateigeodatabase</span>
params<SPAn class="punctuation token">.</SPAn>append<SPAn class="punctuation token">(</SPAn><SPAn class="punctuation token">(</SPAn>param1<SPAn class="punctuation token">,</SPAn>param2<SPAn class="punctuation token">)</SPAn><SPAn class="punctuation token">)</SPAn></span>
<span class='keyword'>if</span> len(inwss) < cpu_cnt:<span class='comment'> # Wenn die Anzahl der Verarbeitungsordner kleiner als die CPU-Kerne ist, unnötige Prozesse vermeiden</span>
cpu_cnt = len(inwss)
pool = multiprocessing.Pool(cpu_cnt) <span class='comment'># Erstelle Python-Prozesse entsprechend der CPU-Anzahl</span>
results = pool.map(multi_run_batch_convert, params) <span class='comment'># Prozesse werden nacheinander ausgeführt mit Zuweisung</span>
pool.close()
pool.join()
<span class='comment'># Ausgabe der Verarbeitungsergebnisse jedes Prozesses</span>
for r in results:
print(r)
<span class='comment'># Zusammenfassung der Feature-Classes innerhalb der Geodatabases je Präfekturordner</span>
<span class='comment'># Hier eintragen, wenn eine landesweite Version erstellt werden soll</span>
<span class='comment'># ~省略~ </span>
fin = datetime.datetime.now()
print "-- Finish: Multiprocess_ShapefileToFeatureClassWithRename --:", fin
print " Verstrichene Zeit:", fin - start
<span class='keyword'>except</span>:
print traceback.format_exc(sys.exc_info()[2])
def setup_batch_convert():
'''
Setze Ausführungsparameter vom Kommandozeilenprogramm:
Ursprungsordner mit Shapefiles je Präfekturordner :infolder
Beispiel)
|-Shapefiles
|- 01_Hokkaido
|-P101_CITY.shp
|-L102_RIVER.shp
・ ・ ・ ・ ・
|- 02_AomoriPrefecture
|- 03_IwatePrefecture
・ ・ ・ ・ ・
Zielordner für die Erstellung der Geodatabases je Präfekturordner :outfolder
Beispiel)
|-Filegdbs
|- 01_Hokkaido.gdb
|-P0101_CITY
|-L0102_RIVER
・ ・ ・ ・ ・
|- 02_AomoriPrefecture.gdb
|- 03_IwatePrefecture.gdb
・ ・ ・ ・ ・
'''</span>
infolder = r"E:\DATA\Shapefiles" <span class='comment'># Ursprungsordner mit Shapefiles je Präfekturordner</span>
outfolder = r"E:\DATA\Filegdbs" <span class='comment'># Zielordner für die Erstellung der Geodatabases je Präfekturordner</span>
exec_batch_convert(infolder, outfolder)
if __name__ == '__main__':
setup_batch_convert<SPAN class="punctuation token">(<\/SPAN><SPAN class="punctuation token">)<\/SPAN><SPAN class="line-numbers-rows"><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN><\/SPAN><SPAN></SPAN></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
Python-Skript-Ausführungsbeispiel in einer 64-Bit-Umgebung
Bitte führen Sie es aus einer 64-Bit-Python-Umgebung aus, wie im Best Practice beschrieben. Beispiele für die Ausführung von Python-Skripten finden Sie in ArcGIS Desktop und ArcGIS Pro.
Ausführungsbeispiel) ArcGIS Desktop 10.6.1
>C:\Python27\ArcGISx6410.6\python.exe Multiprocess_Sample.py
Ausführungsbeispiel) ArcGIS Pro 2.2
>"c:\Program Files\ArcGIS\Pro\bin\Python\scripts\propy.bat" Multiprocess_Sample.py
Referenzblogs und Websites
Arcpy mit Multiprocessing verwenden – Teil 1Arcpy mit Multiprocessing verwenden – Teil 2Arcpy mit Multiprocessing verwenden – Teil 3Python Multiprocessing – Ansätze und Überlegungen (August 2011: ArcGIS 10.0 Umgebung)Multiprocessing mit ArcGIS – Ansätze und Überlegungen (Teil 1) (September 2012: ArcGIS 10.1 Umgebung)Materialien vom John A. Dutton e-Learning Lab der Pennsylvania State UniversityGEOG 489 - Fortgeschrittene Python-Programmierung für GIS - 1.6.6 ArcPy-Multiprocessing-Beispiele
Referenzvideos
Parallel Python: Multiprocessing mit ArcPy (Esri Developer Summit März 2017)Vektor- und Raster-Multiprocessing mit ArcPy (Esri Developer Summit März 2018)