Ich habe Python-Code, der so konzipiert ist, dass er Punkt-Shapefiles durch den folgenden Workflow nimmt:
- Punkte zusammenführen
- Integrieren Sie Punkte so, dass alle Punkte innerhalb von 1 m zu einem Punkt werden
- Feature-Layer erstellen, in dem Punkte mit z <10 ausgewählt werden
- Pufferpunkte
- Polygon bis Raster 1 m Auflösung
- Reklassifizieren, wobei 1 - 9 = 1; NoData = 0
Jedes Shapefile hat ungefähr 250.000 bis 350.000 Punkte auf einer Fläche von ca. 5 x 7 km. Als Eingaben verwendete Punktdaten repräsentieren Baumpositionen. Jedem Punkt (dh Baum) ist ein "z" -Wert zugeordnet, der den Kronenradius darstellt und im Pufferprozess verwendet wird. Ich beabsichtige, die endgültige Binärausgabe in einem separaten Prozess zu verwenden, um ein Raster zu erstellen, das die Überdachung beschreibt.
Ich habe einen Test mit vier Shapefiles durchgeführt und dabei ein Raster von 700 MB erstellt. Der Test dauerte 35 Minuten (i5-Prozessor und 8 GB RAM). Da ich diesen Prozess für 3500 Shapefiles ausführen muss, würde ich mich über jeden Rat freuen, um den Prozess zu rationalisieren (siehe beigefügten Code). Was ist im Allgemeinen der beste Weg, um mit der Geoverarbeitung von Big Data umzugehen? Gibt es irgendwelche Änderungen am Code oder Workflow, die zur Steigerung der Effizienz beitragen könnten?
Bearbeiten :
Zeit (% der Gesamtsumme) für Geoverarbeitungsaufgaben:
- Zusammenführung = 7,6%
- Integrieren = 7,1%
- Merkmal zu Lyr = 0
- Puffer = 8,8%
- Poly zu Raster = 74,8%
- Reklassifizieren = 1,6%
# Import arcpy module
import arcpy
# Check out any necessary licenses
arcpy.CheckOutExtension("spatial")
# Script arguments
temp4 = arcpy.GetParameterAsText(0)
if temp4 == '#' or not temp4:
temp4 = "C:\\gdrive\\temp\\temp4" # provide a default value if unspecified
Reclassification = arcpy.GetParameterAsText(1)
if Reclassification == '#' or not Reclassification:
Reclassification = "1 9 1;NODATA 0" # provide a default value if unspecified
Multiple_Value = arcpy.GetParameterAsText(2)
if Multiple_Value == '#' or not Multiple_Value:
Multiple_Value = "C:\\t1.shp;C:\\t2.shp;C:\\t3.shp;C:\\t4.shp" # provide a default value if unspecified
# Local variables:
temp_shp = Multiple_Value
Output_Features = temp_shp
temp2_Layer = Output_Features
temp_Buffer = temp2_Layer
temp3 = temp_Buffer
# Process: Merge
arcpy.Merge_management(Multiple_Value, temp_shp, "x \"x\" true true false 19 Double 0 0 ,First,#,C:\\#########omitted to save space
# Process: Integrate
arcpy.Integrate_management("C:\\gdrive\\temp\\temp.shp #", "1 Meters")
# Process: Make Feature Layer
arcpy.MakeFeatureLayer_management(temp_shp, temp2_Layer, "z <10", "", "x x VISIBLE NONE;y y VISIBLE NONE;z z VISIBLE NONE;Buffer Buffer VISIBLE NONE")
# Process: Buffer
arcpy.Buffer_analysis(temp2_Layer, temp_Buffer, "z", "FULL", "ROUND", "NONE", "")
# Process: Polygon to Raster
arcpy.PolygonToRaster_conversion(temp_Buffer, "BUFF_DIST", temp3, "CELL_CENTER", "NONE", "1")
# Process: Reclassify
arcpy.gp.Reclassify_sa(temp3, "Value", Reclassification, temp4, "DATA")
quelle
Antworten:
Einige Algorithmusänderungen, die Ihnen helfen sollten.
Führen Sie Ihre Auswahl zuerst vor dem Zusammenführen oder Integrieren aus. Dies reduziert die späteren Funktionen, die am teuersten sind, erheblich.
Zusammenführen und Integrieren sind beide speicherintensiv. Sie möchten also weiterhin Features entfernen, während Sie Feature-Classes einbinden, und versuchen, Ihre Zusammenführungen in einer Binärstruktur vorzunehmen, um die Größe der Zusammenführungen und Integrierungen gering zu halten. zB für vier Shapefiles werden zwei Shapefiles zusammengeführt und integriert; zwei weitere Shapefiles zusammenführen und integrieren; Führen Sie die beiden resultierenden Feature-Classes zusammen und integrieren Sie sie.
Ihre Jobwarteschlange beginnt als Warteschlange mit Shapefile-Referenzen. Sie haben auch eine Ergebniswarteschlange, in die die Ergebnisse gestellt werden können. Die run () -Methode für Ihren Parallelverarbeitungs-Worker führt die folgenden Vorgänge aus: Entfernen Sie zwei Elemente aus der Warteschlange. Wenn kein Artikel entnommen wurde (die Warteschlange ist leer), beenden Sie den Worker. Wenn ein Objekt belegt ist, legen Sie dieses Objekt direkt in die Ergebniswarteschlange.
Wenn für jedes Element zwei Elemente verwendet werden: Wenn es sich um ein Shapefile handelt, wählen Sie z <10 aus, und erstellen Sie eine Feature-Class in_memory. Andernfalls ist es bereits eine in_memory-Feature-Class und überspringt den Auswahlschritt. Führen Sie die beiden in_memory-Feature-Classes zusammen, um eine neue in_memory-Feature-Class zu erstellen. Löschen Sie die beiden ursprünglichen Feature-Classes. Führen Sie "Integrieren" für die neue Feature-Class aus. Fügen Sie diese Feature-Class in die Ergebniswarteschlange ein.
Führen Sie dann eine äußere while-Schleife aus. Die Schleife beginnt mit der Shapefile-Warteschlange und prüft, ob die Länge größer als 1 ist. Anschließend führt sie die Warteschlange durch die Worker. Wenn die Länge der Ergebniswarteschlange größer als 1 ist, führt die while-Schleife eine weitere parallele Verarbeitung durch, bis die Ergebniswarteschlange die Feature-Class 1 in_memory hat.
Beispiel: Wenn Sie mit 3500 Shapefiles beginnen, enthält Ihre erste Warteschlange 3500 Jobs. Zweiter wird 1750 Arbeitsplätze haben. 875, 438, 219, 110, 55, 28, 14, 7, 4, 2, 1. Ihr großer Engpass wird das Gedächtnis sein. Wenn Sie nicht über genügend Arbeitsspeicher verfügen (und wenn dies der Fall ist, wird beim Erstellen der ersten Ergebniswarteschlange nicht genügend Arbeitsspeicher zur Verfügung stehen), ändern Sie Ihren Algorithmus so, dass mehr als 2 Feature-Classes gleichzeitig zusammengeführt und dann integriert werden, was zu einer Verringerung führt Die Größe Ihrer ersten Ergebniswarteschlange im Gegenzug für eine längere Verarbeitungszeit. Optional können Sie Ausgabedateien schreiben und mithilfe der Feature-Classes in_memory überspringen. Dies wird Sie erheblich verlangsamen, würde aber den Speicherengpass überwinden.
Erst nachdem Sie alle Shapefiles zusammengeführt und integriert haben und mit einer einzigen Feature-Class enden, führen Sie den Puffer, das Poly-to-Raster und die Neuklassifizierung durch. Auf diese Weise werden diese drei Vorgänge nur einmal ausgeführt und Sie behalten Ihre Geometrie einfach bei.
quelle
Mit so etwas wie das erste , was ich tun würde , ist Ihr System Ressourcenauslastung überwachen Ressourcenmonitor in Windows 7 oder perfmon in Vista / XP ein Gefühl dafür zu bekommen , ob Sie CPU -, Speicher - oder IO-gebunden .
Wenn Sie an Arbeitsspeicher oder E / A gebunden sind, können Sie wahrscheinlich nur die Hardware aktualisieren, die Problemgröße verringern oder den Ansatz vollständig ändern.
Wenn Sie feststellen, dass Sie CPU-gebunden sind, würde ich mit dem
multiprocessing
Modul oder einem der vielen anderen verfügbaren Python-basierten Parallelverarbeitungspakete experimentieren, um festzustellen, ob Sie mehr CPU-Kerne verwenden können, um Ihre Vorgänge zu beschleunigen.Der Trick für Multiprocessing und Parallelität im Allgemeinen besteht darin, ein gutes Partitionsschema zu finden, das:
Sie können das Skript, das ich in dieser Antwort erstellt habe, als Ausgangspunkt verwenden: Porting Avenue-Code zum Erstellen von Schatten für ArcPy / Python for ArcGIS Desktop?
Siehe auch diesen Blogeintrag zu ESRI Geoprocessing zum Thema: Python Multiprocessing - Ansätze und Überlegungen
Ich denke, dass Ihr Fall aufgrund der "Black Box" -Natur der verwendeten Werkzeuge und nicht der feinkörnigeren Geometriearrays, mit denen ich gearbeitet habe, noch herausfordernder wird. Vielleicht kann es nützlich sein , mit NumPy- Arrays zu arbeiten .
Ich habe auch interessantes Lesematerial gefunden, wenn Sie über arcpy hinausblicken wollten:
quelle