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()])
Respostas:
ESTÁ BEM. Esse foi um dia da minha vida que nunca mais voltarei. Acontece que o problema não estava no código que eu postei acima. Isso é totalmente bom. Acontece que este foi um caso de threading.Thread vs. multiprocessing.Process.
Conforme apontado na documentação do python :
Assim, threading.Thread é para operações intensivas de IO, multiprocessamento.Process é para operações intensivas de CPU. Eu mudei para multiprocessing.Process e tudo funciona muito bem.
Confira este tutorial para aprender como usar o multiprocessamento.
fonte