Estou tentando processar alguns dados rasterizados usando ogr / gdal e não consigo obter a utilização completa de todos os núcleos da minha máquina. Quando apenas executo o processo em um único núcleo, obtenho 100% de utilização desse núcleo. Quando tento dividir em multicore (no exemplo abaixo, dividindo os deslocamentos x e colocando-os em uma fila), obtenho uma utilização patética em cada um dos meus 8 núcleos. Parece que apenas adiciona 100% de utilização em cada núcleo (por exemplo, 12,5% em cada).
Eu estava preocupado que o uso da mesma fonte de dados fosse o gargalo, mas dupliquei o arquivo raster subjacente para cada núcleo ... e a utilização do núcleo ainda é uma porcaria. Isso me leva a acreditar que ogr ou gdal está de alguma forma se comportando como um recurso compartilhado por gargalo, mas não consigo encontrar nada online sobre isso. Qualquer ajuda seria muito apreciada!
Esta é a função "auxiliar" que é executada dentro de cada thread do Worker:
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()])