OGR / GDAL-Threading führt zu einer geringen Kernauslastung

13

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()])
Max
quelle
Unwahrscheinlich, aber haben Sie überprüft, ob der Speicher der Engpass ist?
Lynxlynxlynx
@lynxlynxlynx - ja. Speicher ist definitiv nicht der Engpass. Ich habe den ganzen Tag versucht, dieses Ding aufzuspüren ... das ist ziemlich seltsam.
Max
Es kann sein, dass der von Ihnen verwendete Rastertreiber nicht für den gleichzeitigen Aufruf von mehr als einem Thread ausgelegt ist. Referenz: mail-archive.com/[email protected]/msg07283.html
blah238

Antworten:

10

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 :

Das Multiprocessing-Paket bietet sowohl lokale als auch Remote-Parallelität, wodurch die globale Interpretersperre effektiv umgangen wird, indem Unterprozesse anstelle von Threads verwendet werden. Aus diesem Grund kann der Programmierer mit dem Multiprozessormodul mehrere Prozessoren auf einer bestimmten Maschine voll ausnutzen

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

Max
quelle
Ich wollte nur vorschlagen, dass ich nicht sicher war, welche Implementierung (es gibt auch Implementierungen von Drittanbietern ) Sie verwenden :) Ich habe das kürzlich verwendet, um ein ordentliches Werkzeug für das Erstellen von Schatten hier zu beschleunigen: Port „Producing Building Shadows“ Avenue Code für ArcGIS 10
blah238
+1 Ich wollte gerade posten, dass Sie ein Wort auf der GDAL-dev-Mailingliste haben sollten. aber ich bin jetzt froh, dass du es nicht getan hast! Dies wurde zum späteren Nachschlagen mit einem Eichhörnchen entfernt.
MerseyViking
FWIW (wahrscheinlich nicht sehr viel): Ich habe gelesen, dass Leute Geld sammeln, um das Problem der globalen Interpreter-Sperre (GIL) zu beheben. Ich denke es wird für 3.x sein.
canisrufus