ogr / gdal을 사용하여 일부 래스터 데이터를 처리하려고하는데 컴퓨터의 모든 코어를 완전히 활용하지 못하는 것 같습니다. 단일 코어에서만 프로세스를 실행하면 해당 코어를 100 % 활용합니다. 멀티 코어로 분할하려고하면 (아래 예에서 x 오프셋을 청크하고 대기열에 넣음) 8 개의 코어 각각에 대한 활용도가 높아집니다. 각 코어에서 최대 100 %의 사용률 만 추가하는 것 같습니다 (예 : 각각 12.5 %).
동일한 데이터 소스를 사용하는 것이 병목이 될까봐 걱정했지만 각 코어마다 기본 래스터 파일을 복제했습니다 ... 코어 사용률은 여전히 엉망입니다. 이것은 ogr 또는 gdal이 어떻게 든 병목 공유 리소스처럼 작동한다고 믿게하지만 온라인에서 아무것도 찾을 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다!
이것은 각 Worker 스레드 내에서 실행되는 "helper"함수입니다.
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()])