大数据系统的数据管理,采用位图索引、树索引等。
==Git软件的对象计数(counting )==
Git Clone时,需要实时计算出来,需要克隆的对象总数。
Git的对象。简单说,对象就是文件,最重要的对象有三种:快照对象(Commit),目录对象(Directory)和文件对象(File)。
"对象计数"就是清点各种commit、目录、文件等。git clone和git fetch操作都需要清点对象,因为需要知道,到底下载哪些对象文件。
对象计数的原始算法如下。
#列出本地所有分支最新的一个commit
#列出远程所有分支最新的一个commit
#两者进行比较,只要有不同,就意味着分支发生变动
#每一个发生变动的commit,都清点其中具体变动的子目录和文件
#追溯到当前commit的父节点,重复第四步,直至本地与远程的历史一致为止
#加总所有需要变动的对象
==位图索引==
建立一个Bitmap索引,即为每一个commit生成一个二进制值。
打开本地Github仓库的.git/objects/pack/目录,你会看到一个索引文件和一个数据文件,它们就是Bitmap。
简单说,这两个文件索引了当前代码库的所有对象,然后使用一个二进制值代表这些对象。有多少个对象,这个二进制值就有多少位。它的第n位,就代表数据文件里面的第n个对象。
每个commit都会有一个对应的二进制值,表示当前快照包含的所有对象。这些对象对应的二进制位都为1,其他二进制位都为0。
这样做的好处是,不用读取commit对象,只要读取这个二进制值,就会知道当前commit包含了哪些节点。更妙的是,两个二进制值只要做一次XOR运算,就会知道哪些位(即哪些对象)发生了变动。而且,因为新的对象总是添加到现有二进制位的后面,所以只要读取多出来的那些位,就知道当前commit比上一次commit多出了哪些对象。
这样一来,"清点对象"就变成了二进制值的比较运算,因此速度极快。
https://github.com/gitster/git/commit/fff4275
https://github.com/gitster/git/blob/master/Documentation/technical/bitmap-format.txt
= 索引(搜索引擎) =