海量空间数据的读取
陈玉进 李泉 南京跬步科技有限公司(http://www.creable.cn)
海量数据的存取,效率是核心。在有限的内存容量和CPU处理能力下,为了提高效率,需要减少冗余数据读取所带来增加I/O的开销,减少冗余数据对内存的占用,同时也减少对冗余数据的处理,更进一步,提高对有效数据的处理效率。空间数据的组织模型以及空间索引,是解决这一问题的关键。
一、 网格索引
在嵌入式设备上,网格索引是一种效率非常高的索引,但要求线、面数据按网格裁切,破坏了空间实体的整体性,为此,需要在内部逻辑层面,把经过裁切的属于同一实体的碎部连接起来,还原出逻辑实体,便于以后的空间分析。网格索引,是为了快速定位到需要读取的数据,避免冗余数据的读取。
当空间数据海量时,空间跨度比较大,且数据密集,网格划分也相应很密集,带来网格索引本身的数据量激增。因此,需要在“一级索引”的基础上建立“二级网格索引”,根据当前窗口范围,通过“二级索引”调入局部的网格索引数据,以减少整个一级网格索引对内存的大量占用。
二级网格索引,形象的比喻就是“一级索引小网格”嵌套于“二级索引大网格”之中,大网格常驻内存,根据当前显示范围,决定是否需要调入小网格的数据,若需要,通过当前窗口与大网格求交,判断需要调入哪几块小网格索引数据进内存,在内存中拼接成一个整体的二维数组网格索引,同时记录下网格单元的大小和左下角和右上角的位置,当空间范围超出当前网格索引的范围,需要调入新的网格索引数据,修改内存中的网格索引。
空间数据的存储,建立一级索引,网格数为n(n是4的幂次),空间数据按网格的Hilbert排列顺序存储,再在一级索引的基础上,建立粒度更粗的二级索引,二级索引的网格数为N(N是n的4的幂次分之一,即n/(4^x),x为正整数),每个二级索引的网格,索引到对应范围内一级索引的一组网格。一个大网格对应的小网格,按二维数组顺序存储,而大网格之间的排序按Hilbert顺序存储,即可生成一级网格索引的文件,通过二级索引查找此文件,动态按需调入部分索引数据进内存。
二、 空间数据组织模型
空间数据的组织模型,关系到空间数据读取的效率,尽可能地把一起被读取的数据集中存储、集中索引,避免多次读取文件,避免多次跳转带来的时间开销以及数据冗余。为此,提出了多图层数据共享同一文件、同一显示级别的多图层共存同一网格的数据模型,极大地避免了冗余数据的读取,提高整个系统的性能。不同显示级别,采用不同的网格索引,同一显示级别,采用相同的网格索引,网格数据内部按图层分类存储。