Я пытаюсь обработать некоторые растровые данные, используя ogr / gdal, и я не могу получить полное использование всех ядер на моей машине. Когда я запускаю процесс только на одном ядре, я получаю 100% -ное использование этого ядра. Когда я пытаюсь разделить на многоядерные (в приведенном ниже примере, разбивая смещения по x и помещая их в очередь), я получаю жалкое использование на каждом из моих 8 ядер. Похоже, что это добавляет до 100% загрузки на каждое ядро (например, 12,5% на каждое).
Я был обеспокоен тем, что использование одного и того же источника данных было узким местом, но затем я продублировал базовый растровый файл для каждого ядра ... и использование ядра по-прежнему дерьмо. Это наводит меня на мысль, что ogr или gdal как-то ведут себя как общий ресурс с узким местом, но я не могу найти в Интернете ничего об этом. Любая помощь приветствуется!
Это «вспомогательная» функция, которая запускается внутри каждого рабочего потока:
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()])