Próbuję przetwarzać niektóre dane rastrowe przy użyciu ogr / gdal i nie mogę uzyskać pełnego wykorzystania wszystkich rdzeni na moim komputerze. Kiedy uruchamiam ten proces tylko na jednym rdzeniu, uzyskuję 100% wykorzystania tego rdzenia. Kiedy próbuję podzielić się na wielordzeniowy (w poniższym przykładzie, dzieląc x przesunięć i umieszczając je w kolejce), uzyskuję żałosne wykorzystanie na każdym z moich 8 rdzeni. Wygląda na to, że stanowi jedynie 100% wykorzystania w każdym rdzeniu (np. 12,5% w każdym z nich).
Martwiłem się, że korzystanie z tego samego źródła danych jest wąskim gardłem, ale potem zduplikowałem podstawowy plik rastrowy dla każdego rdzenia ... a wykorzystanie rdzenia wciąż jest bzdurą. To prowadzi mnie do przekonania, że ogr lub gdal w jakiś sposób zachowuje się jak wąskie gardło udostępnionego zasobu, ale nie mogę znaleźć niczego online na ten temat. Każda pomoc będzie mile widziana!
To jest funkcja „pomocnika”, która działa wewnątrz każdego wątku roboczego:
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()])