Sto cercando di elaborare alcuni dati raster usando ogr / gdal e non riesco a ottenere il pieno utilizzo di tutti i core della mia macchina. Quando eseguo il processo solo su un singolo core, ottengo il 100% di utilizzo di quel core. Quando provo a dividere in multicore (nell'esempio seguente, tagliando gli offset x e mettendoli in coda), ottengo un utilizzo patetico su ciascuno dei miei 8 core. Sembra che aggiunge solo fino al 100% di utilizzo su ciascun core (ad es. 12,5% su ciascuno).
Ero preoccupato che utilizzare lo stesso datasource fosse il collo di bottiglia, ma poi ho duplicato il file raster sottostante per ciascun core ... e l'utilizzo del core è ancora una schifezza. Questo mi porta a credere che ogr o gdal si stiano comportando in qualche modo come una risorsa condivisa da strozzature ma non riesco a trovare nulla online a riguardo. Qualsiasi aiuto sarebbe molto apprezzato!
Questa è la funzione "helper" che viene eseguita all'interno di ogni thread di lavoro:
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()])