RFC 13: 배치 모드에서의 피처 삽입/업데이트/삭제 성능 향상

저자: 콘스탄틴 바우만(Konstantin Baumann)

연락처: konstantin.baumann@hpi.uni-potsdam.de

상태: 철회

철회

‘gdal-dev’ 메일링 리스트 상에서 프랑크 바르메르담세케레시 터마시 가 보낸 몇몇 코멘트를 기반으로 이 RFC를 철회합니다.

요약

드라이버가 (하나씩 하는 대신) 한 번에 삽입, 업데이트, 또는 삭제해야 하거나 할 수 있는 온전한 피처 집합이 있다는 것을 알고 있는 경우, 일부 OGR 드라이버는 피처 집합의 삽입, 업데이트, 그리고 삭제 속도를 극적으로 높이고 최적화할 수 있습니다.

CreateFeatures()

GDALDataset 클래스에 다음과 같은 새로운 가상 메소드를 유사한 C 함수와 함께 추가합니다:

virtual OGRErr CreateFeatures( OGRFeature** papoFeatures, int iFeatureCount );

기본 구현은 다음과 같습니다:

OGRErr OGRLayer::CreateFeatures(
    OGRFeature **papoFeatures,
    int iFeatureCount
) {
    for(int i = 0; i < iFeatureCount; ++i) {
        OGRErr error = CreateFeature( papoFeatures[i] );
        if( error != OGRERR_NONE ) return error;
    }
    return OGRERR_NONE;
}

기본 구현은 최적화되지 않은 예전의 삽입 습성을 촉발합니다.

개별 드라이버는 기본 구현을 대체해서 피처 집합을 삽입하기 위한 최적화된 알고리즘을 구현할 수 있습니다.

SetFeatures()

GDALDataset 클래스에 다음과 같은 새로운 가상 메소드를 유사한 C 함수와 함께 추가합니다:

virtual OGRErr SetFeatures( OGRFeature** papoFeatures, int iFeatureCount );

기본 구현은 다음과 같습니다:

OGRErr OGRLayer::SetFeatures(
    OGRFeature **papoFeatures,
    int iFeatureCount
) {
    for(int i = 0; i < iFeatureCount; ++i) {
        OGRErr error = SetFeature( papoFeatures[i] );
        if( error != OGRERR_NONE ) return error;
    }
    return OGRERR_NONE;
}

기본 구현은 최적화되지 않은 예전의 업데이트 습성을 촉발합니다.

개별 드라이버는 기본 구현을 대체해서 피처 집합을 업데이트하기 위한 최적화된 알고리즘을 구현할 수 있습니다.

DeleteFeatures()

GDALDataset 클래스에 다음과 같은 새로운 가상 메소드를 유사한 C 함수와 함께 추가합니다:

virtual OGRErr DeleteFeatures( long *panFIDs, int iFIDCount );

기본 구현은 다음과 같습니다:

OGRErr OGRLayer::DeleteFeatures(
    long *panFIDs,
    int iFIDCount
) {
    for(int i = 0; i < iFIDCount; ++i) {
        OGRErr error = DeleteFeature( panFIDs[i] );
        if( error != OGRERR_NONE ) return error;
    }
    return OGRERR_NONE;
}

기본 구현은 최적화되지 않은 예전의 삭제 습성을 촉발합니다.

개별 드라이버는 기본 구현을 대체해서 피처 집합을 삭제하기 위한 최적화된 알고리즘을 구현할 수 있습니다.

C API 함수

다음 C 함수를 추가합니다:

OGRErr OGR_L_CreateFeatures( OGRFeature** papoFeatures, int iFeatureCount );
OGRErr OGR_L_SetFeatures( OGRFeature** papoFeatures, int iFeatureCount );
OGRErr OGR_L_DeleteFeatures( long* panFIDs, int iFIDCount );

하지만, SWIG 기반 래핑(wrapping) 때문에 공개 OGR 인터페이스에 평문 C 배열을 추가하는 데 조금 문제가 있습니다. 예를 들면 세케레시 터마시가 보낸 ‘gdal-dev’ 이메일 을 읽어보십시오.

추가 메모

이 새로운 인터페이스 함수를 기반으로, MySQL 드라이버에서 피처 삽입 속도를 초당 40개에서 초당 800~2,000개로 높일 수 있었습니다. 다른 드라이버들도 이 변경 사항으로 혜택을 볼 수 있을 거라 믿습니다.

#1633 티켓도 참조하십시오.

구현 계획

추가 사항을 설명하기 위한 간단한 패치를 제공할 수 있습니다.

MySQL 드라이버 용 최적화 구현을 담고 있는 인터페이스를 기반으로 하는 또다른 패치를 제공할 수 있습니다.

이력

2007년 5월 14일: 초안 작성

2007년 5월 15일: SetFeatures() 추가

2007년 5월 16일: DeleteFeatures() 추가

2007년 5월 17일: C API 함수 추가; SWIG 래핑(wrapping) 문제점 언급

2007년 5월 23일: ‘gdal-dev’ 메일링 리스트 상에서의 몇몇 우려로 철회