Я намагаюся обробити деякі растрові дані за допомогою ogr / gdal, і я не можу отримати повне використання всіх ядер на своїй машині. Коли я запускаю процес лише на одному ядрі, я отримую 100% використання цього ядра. Коли я намагаюся розділити на багатоядерні (на прикладі нижче, відбиваючи зсуви x і ставлячи їх у чергу), я отримую жалюгідне використання на кожному з моїх 8 ядер. Схоже, це лише додає до 100% використання в кожному ядрі (наприклад, 12,5% на кожне).
Я був стурбований тим, що використання одного і того ж джерела даних було вузьким місцем, але я потім копіював нижній растровий файл для кожного ядра ... і використання ядра все ще лайно. Це приводить мене до думки, що ogr чи gdal якось поводяться як загальний ресурс, але я нічого не можу знайти про це в Інтернеті. Будь-яка допомога буде дуже вдячна!
Це функція "помічник", яка працює всередині кожного потоку 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()])