当我们可以最大限度地复用文件存储区时,我们就可以对原有的数据结构进行调整,比如:可以把索引文件和数据文件合并到一个文件中而不必考虑图片的增长而导致的索引存储区空间不足的情况,可以在增加和删除数据单元时不必更新整个索引区而只更新更改的那部分索引区……等等,所以上一节的内容对于旧版本的数据结构进化起到了一个重要的作用。
重新设计后的数据结构不再局限于存储Google地图,而是面向了所有带有可排序的键的数据单元,如下图:
整个数据结构存储与一个文件中,使用文件流进行数据访问,数据结构说明:
数据头部分:
1.文件格式字符串:存储在文件头部的固定字符内容,用于区分不同的文件格式。
2.创建时间,修改时间
3.索引入口点:数据索引的入口点,两个long型数据单元,占用16字节,第一个long型指向了数据存储区中的索引起始位置,第二个long型指向了数据结束位置
4.空闲空间存储区入口点:同索引入口点,只是指向的位置是空闲空间存储区
5.文件实际长度:这是一个后来加入的属性,因为考虑到要支持大文件时要用的文件的映射而增加的
6.160字节预留区:预留以后扩展时需要用的属性存储区
7.数据存储区:
数据存储区的部分数据部分是不固定的,由空闲空间管理器管理(第三节所设计的类型FreeRange)
8.二级索引入口点:存储了一个二级索引列表,以及这些索引所对应的数据单元入口点,如果所指向的数据单元也是一个索引存储区,那么可以称之为三级索引…… 类推,可以产生N级索引
9.空闲空间存储区:用于存储这个数据文件中有哪些部分是空闲的空间,可以复用的空间
访问这种数据结构的关键在于查询多级索引,前面已经提到过,索引的存储是按照从小到大排序的,所以针对这种级联的关系,我们应该设计一个通用的对单个索引区的搜索方法,然后根据传入的索引层级遍历搜索。例如:当需要搜索第5层地图的第32张图片时,我们可以根据索引入口点搜索到第5层的二级索引存储区,然后在二级索引存储区中搜索第32个图片存储区,最后返回。
至此,无限级索引的数据结构设计已经基本完成。
需要浏览代码的,可以到我的资源箱中下载IndexicalData,额…… CSDN中帖子不知道怎么上传附件
注:代码主要以研究学习为主,还未投入使用,并且有许多需要整理改进的地方,比如:写入和读取的缓存机制等……
如果你对这部分研究比较感兴趣的话,我们可以一起探讨,共同进步。