RFC13:在批处理模式下提高了特征插入/更新/删除性能

Author: Konstantin Baumann

Contact: konstantin.baumann@hpi.uni-potsdam.de

Status: Withdrawn

撤回

我已经根据一些来自 FrankTamas 在GDAL-dev上。

总结

一些OGR驱动程序可以极大地提高插入、更新和删除一组功能的速度并优化这些功能,如果驱动程序知道应该/可以立即插入、更新或删除一整套功能(而不是一个接一个)。

创建功能()

下面的新虚方法被添加到OGRLayer类中,并带有一个类似的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;
}

这会触发未优化插入的旧行为。

单个驱动程序可以覆盖默认实现,并可以实现用于插入一组功能的优化算法。

设置功能()

下面的新虚方法被添加到OGRLayer类中,并带有一个类似的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;
}

这会触发未优化更新的旧行为。

单个驱动程序可以覆盖默认实现,并可以实现用于更新一组功能的优化算法。

删除功能()

下面的新虚方法被添加到OGRLayer类中,并带有一个类似的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的包装,在公共OGR接口中添加纯C数组时存在一些问题,请参见 GDAL-Dev Mail from Tamas

附加说明

基于这个新的接口函数,我能够将MySQL驱动程序中特性的插入速度从每秒40提高到每秒800-2000。我认为其他司机也可以从这一变化中受益。

另见票证1633。

实施计划

可以简单地提供一个用于添加descripe的补丁。

我可以基于这个接口提供另一个补丁,其中包含MySQL驱动程序的优化实现。

历史

2007年5月14日:创建初始版本

2007年5月15日:添加SetFeatures()

2007年5月16日:添加了DeleteFeatures()

2007年5月17日:添加了C API函数;提到了SWIG包装问题

2007年5月23日:由于对GDAL dev的一些担忧而撤销