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()])
Respuestas:
OKAY. Ese fue un día de mi vida que nunca volveré otra vez. Resulta que el problema no estaba en el código que publiqué anteriormente. Eso está totalmente bien. Resulta que este fue un caso de subprocesamiento. Subproceso vs. multiprocesamiento. Proceso.
Como se señala en la documentación de Python :
Por lo tanto, threading.Thread es para operaciones intensivas de E / S, multiprocesamiento. El proceso es para operaciones intensivas de CPU. Cambié al multiprocesamiento. Proceso y todo funciona muy bien.
Consulte este tutorial para aprender a usar el multiprocesamiento.
fuente