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()])