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()])
Odpowiedzi:
DOBRZE. To był dzień mojego życia, którego już nigdy nie wrócę. Okazuje się, że problemu nie ma w powyższym kodzie. W porządku. Okazuje się, że był to przypadek wątkowania. Gwint vs. proces wieloprocesowy.
Jak wskazano w dokumentacji Pythona :
W związku z tym gwintowanie. Wątek jest przeznaczony do operacji intensywnie korzystających z operacji wejścia / wyjścia, proces wieloprocesowy. Przełączyłem się na proces wieloprocesowy. Proces i wszystko działa świetnie.
Sprawdź ten samouczek, aby dowiedzieć się, jak korzystać z przetwarzania wieloprocesowego
źródło