Gwintowanie OGR / GDAL powoduje niskie zużycie rdzenia

13

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()])
Max
źródło
Mało prawdopodobne, ale czy sprawdziłeś, czy pamięć jest wąskim gardłem?
lynxlynxlynx
@lynxlynxlynx - tak. Pamięć zdecydowanie nie jest wąskim gardłem. Próbowałem śledzić to przez cały dzień ... to dość dziwne.
Maks.
Możliwe, że używany sterownik rastrowy po prostu nie jest zaprojektowany do wywoływania z więcej niż jednego wątku na raz. Odniesienie: mail-archive.com/[email protected]/msg07283.html
blah238

Odpowiedzi:

10

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 :

Pakiet wieloprocesowy oferuje zarówno lokalną, jak i zdalną współbieżność, skutecznie omijając blokadę globalnego interpretera, wykorzystując podprocesy zamiast wątków. Z tego powodu moduł wieloprocesowy pozwala programiście w pełni wykorzystać wiele procesorów na danym komputerze

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

Max
źródło
Chciałem tylko zasugerować, że nie byłem pewien, której implementacji (są też implementacje innych firm ), której używasz :) Użyłem jej ostatnio, aby przyspieszyć tutaj narzędzie do tworzenia cieni w budynku: Port „Produkowanie cieni do budynków” kod do ArcGIS 10
blah238
+1 Właśnie miałem opublikować, że powinieneś mieć słowo na liście dyskusyjnej GDAL-dev; ale teraz cieszę się, że nie! Zostało to wycofane do wykorzystania w przyszłości.
MerseyViking
FWIW (prawdopodobnie nie bardzo), czytałem gdzieś, że ludzie zbierają fundusze, aby spróbować rozwiązać problem globalnej blokady interpretera (GIL). Myślę, że będzie to 3.x.
canisrufus