RFC40:提高大型表的栅格属性表实现性能

总结:

来自某些应用程序(特别是分段)的栅格属性表可能非常大,并且由于一次只能读取或写入一个元素,因此使用当前API访问很慢。另外,当应用程序请求一个属性表时,必须读取整个表-没有办法延迟,所以只读取所需的子集。这些更改将使属性表支持更符合栅格数据的访问方式。

实施:

建议将GDALRasterAttributeTable重写为一个虚拟基类。这将允许驱动程序拥有自己的实现,只在请求时读取和写入数据。将提供一个新的派生类GDALDefaultRasterAttributeTable,它提供GDAL 1.x GDALRasterAttributeTable的功能(即在内存中保存所有数据)。

GDALRasterAttributeTable类中将提供其他方法,这些方法允许在一次调用中读取/写入列中的“块”数据。与GetValueAs函数一样,不同类型的列可以读取为不同类型的值(即,将int列读取为double),并进行适当的转换。将提供以下重载方法:

CPLErr ValuesIO(GDALRWFlag eRWFlag, int iField, int iStartRow, int iLength, double *pdfData);
CPLErr ValuesIO(GDALRWFlag eRWFlag, int iField, int iStartRow, int iLength, int *pnData);
CPLErr ValuesIO(GDALRWFlag eRWFlag, int iField, int iStartRow, int iLength, char **papszStrList);

应用程序将以与RasterIO()调用相同的方式分配所需的读取空间。

** 类型将用于读取和写入字符串。在读取字符串时,应该以正确的大小创建数组,ValuesIO只会为每一行创建单独的字符串。在取消分配数组之前,应用程序应该对每个字符串调用CPLFree。

这些方法可从C获得,如GDALRATValuesIOAsDouble、GDALRATValuesIOAsInteger和GDALRATValuesIOAsString。

这也是一个删除属性表上未使用的函数(如GetRowMin()、GetRowMax()和GetColorOfValue()的机会。

语言绑定:

Python绑定将被更改,因此ValuesIO将被支持使用numpy数组对数据进行适当的类型转换。将使用对字符串数组的numpy支持来支持字符串。

向后兼容性:

提议的添加将扩展C API。然而,C++二进制接口将被破坏,因此建议GDAL 2作为适当的时间来介绍这些更改。

在gdalStartAttributeTable类的派生实现中,仍然需要注意支持Clone()和Serialize()的使用,因为它们是由现有代码调用的。对于不将表保存在内存中的实现,如果表大于某个适当的限制(例如GetRowCount() * GetColCount()<1000 000)。Clone()应返回gdalDefaultRasAtterTributable的实例,以防止对象之间共享内存出现问题。

如果仍然需要内存中的实现,则可能需要更改现有代码以使用GDALDefaultRasterAttributeTable而不是gdalStartAttributeTable的创建实例。

对驾驶员的影响

HFA驱动程序将被更新,以支持新接口的所有方面,如新功能和请求时的读/写。其他驱动程序将被修改以继续使用内存中的实现(GDALDefaultRasterAttributeTable)。

测试

Python自动测试套件将被扩展以测试新的API,包括HFA驱动程序的默认实现和专门实现。

时间线

我们(Sam Gillingham和Pete Bunting)已准备好承担所需的工作,并准备好将其纳入GDAL 1.11。需要讨论方法的名称和方法的内部逻辑。

车票

已开出5129号罚单,以跟踪此RFC的进度。