Ich versuche, einige Rasterdaten mit ogr / gdal zu verarbeiten, und ich kann anscheinend nicht alle Kerne auf meinem Computer voll ausnutzen. Wenn ich den Prozess nur auf einem einzelnen Kern ausführe, wird dieser Kern zu 100% genutzt. Wenn ich versuche, mich in mehrere Kerne aufzuteilen (im folgenden Beispiel, indem ich die x-Offsets zerlege und in eine Warteschlange stelle), bekomme ich eine erbärmliche Auslastung für jeden meiner 8 Kerne. Es sieht so aus, als würde nur eine Auslastung von 100% pro Kern erreicht (z. B. 12,5% pro Kern).
Ich war besorgt, dass die Verwendung derselben Datenquelle der Engpass war, aber dann habe ich die zugrunde liegende Rasterdatei für jeden Kern dupliziert ... und die Kernauslastung ist immer noch Mist. Dies lässt mich glauben, dass sich OGR oder GDAL irgendwie wie eine gemeinsam genutzte Ressource mit Engpass verhalten, aber ich kann online nichts dazu finden. Jede Hilfe wäre sehr dankbar!
Dies ist die "Hilfefunktion", die in jedem Worker-Thread ausgeführt wird:
def find_pixels_intersect_helper(datasource, bounds_wkt, x_min, x_max):
bounds = ogr.CreateGeometryFromWkt(bounds_wkt)
rows_to_write = []
for x_offset in range(x_min, x_max):
for y_offset in range(datasource.RasterYSize):
pxl_bounds_wkt = pix_to_wkt(datasource, x_offset, y_offset)
pxl_bounds = ogr.CreateGeometryFromWkt(pxl_bounds_wkt)
if pxl_bounds.Intersect(bounds):
rows_to_write.append(['%s_%s' % (x_offset, y_offset), pxl_bounds.Centroid().ExportToWkt()])
Antworten:
IN ORDNUNG. Das war ein Tag meines Lebens, an dem ich nie wieder zurückkehren werde. Es stellte sich heraus, dass das Problem nicht in dem Code war, den ich oben gepostet habe. Das ist völlig in Ordnung. Es stellte sich heraus, dass dies ein Fall von threading.Thread vs. multiprocessing.Process war.
Wie in der Python-Dokumentation ausgeführt :
Daher ist threading.Thread für E / A-intensive Vorgänge und multiprocessing.Process für CPU-intensive Vorgänge. Ich wechselte zu Multiprocessing.Process und alles funktioniert super.
In diesem Lernprogramm erfahren Sie, wie Sie Multiprocessing.Process verwenden
quelle