코어 사용률이 낮은 OGR / GDAL 스레딩


13

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()])

그러나 메모리가 병목 현상인지 확인 했습니까?
lynxlynxlynx 2016 년

@lynxlynxlynx-응. 메모리는 병목 현상이 아닙니다. 하루 종일이 일을 추적하려고했는데 ... 이건 정말 이상합니다.
Max

사용중인 래스터 드라이버가 한 번에 둘 이상의 스레드에서 호출되도록 설계되지 않았을 수 있습니다. 참조 : mail-archive.com/gdal-dev@lists.osgeo.org/msg07283.html
blah238

답변:


10

확인. 그것은 다시는 돌아 오지 않을 내 인생의 하루였습니다. 위에서 게시 한 코드에 문제가 없었습니다. 완전히 괜찮습니다. 스레딩과 멀티 프로세싱 프로세스의 경우였습니다.

파이썬 문서 에서 지적했듯이 :

멀티 프로세싱 패키지는 로컬 및 원격 동시성을 모두 제공하며 스레드 대신 서브 프로세스를 사용하여 글로벌 인터프리터 잠금을 효과적으로 회피합니다. 이로 인해 멀티 프로세싱 모듈을 통해 프로그래머는 주어진 머신에서 여러 프로세서를 완전히 활용할 수 있습니다.

따라서 threading.Thread는 IO 집약적 인 작업, 다중 처리, 프로세스는 CPU 집약적 인 작업을위한 것입니다. 나는 다중 처리로 전환했습니다. 프로세스와 모든 것이 훌륭하게 작동합니다.

멀티 프로세싱을 사용하는 방법을 배우려면 이 학습서 를 확인하십시오.


나는 당신이 어떤 구현 ( 제 3 자 구현 이 있는지)을 확신하지 못했다고 제안하려고했다 :) 나는 최근에 깔끔한 건물 그림자 도구의 속도를 높이기 위해 이것을 사용했다 : Port“Building Building Shadows”Avenue ArcGIS 10에 코드
blah238

+1 GDAL-dev 메일 링리스트에 글이 있어야한다고 게시하려고했습니다. 그러나 나는 당신이하지 않은 것을 기쁘게 생각합니다! 이것은 나중에 참조 할 수 있도록 해결되었습니다.
MerseyViking 2018 년

FWIW (아마도 많지는 않지만), 사람들이 GIL (Global Interpreter Lock) 문제를 해결하기 위해 자금을 모으는 곳을 읽었습니다. 나는 그것이 3.x가 될 것이라고 생각한다.
canisrufus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.