Estoy tratando de procesar algunos datos ráster usando ogr / gdal y parece que no puedo obtener la plena utilización de todos los núcleos de mi máquina. Cuando solo ejecuto el proceso en un solo núcleo, obtengo el 100% de utilización de ese núcleo. Cuando trato de dividirme en multinúcleo (en el ejemplo a continuación, al dividir las compensaciones x y ponerlas en una cola), obtengo una utilización patética en cada uno de mis 8 núcleos. Parece que solo agrega hasta un 100% de utilización en cada núcleo (por ejemplo, 12.5% en cada uno).
Me preocupaba que usar el mismo origen de datos fuera el cuello de botella, pero luego dupliqué el archivo ráster subyacente para cada núcleo ... y la utilización del núcleo sigue siendo una mierda. Esto me lleva a creer que ogr o gdal se está comportando de alguna manera como un recurso compartido de cuello de botella, pero no puedo encontrar nada en línea sobre eso. Cualquier ayuda sería muy apreciada!
Esta es la función "auxiliar" que se ejecuta dentro de cada subproceso de trabajo:
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()])