这一回介绍Larin中的基本数据结构,其实这一部分对于每一个高水平的程序来说,都是相似的,但是在此还是废话一下。
首先从我接触到的第一个数据结构开始(因为我在详细阅读代码前首先做了些源代码修改工作)——Vector
(1)%LARBIN_HOME%/src/utils/Vector
这个类唯一值得一提的就是他的存储空间优化机制。这在大量的数据结构中都有。
它有两个成员变量:
uint pos;
uint size;
其中pos代表vector的使用容量,size代表vector的占用容量。
当占用容量不够用,vector就需要进行一次扩容。代码中是扩1倍容量,如果还不够,就扩到当前需要的量。
vector的使用处:大家应该还记得第2部分中,用户可以参与的程序部分。
也就是loaded()函数,他的参数是一个html。它里面包含一个vector用于存储当前页面指向的链接。如果需要输出特定的链接关系(用于PR)的话,那么就需要用到这个结构。
(2)%LARBIN_HOME%/src/utils/url
这个类主要处理url相关的一些基本问题。他的成员变量中包含Host,port等url的基础组成部分。
它的内部包含两个hashcode的算法,一个是求对整体url的hash值,一个是对Host求hash值。
这两个求值用在的地方也不太一样。在后面会详细介绍。
(3)%LARBIN_HOME%/src/utils/Fifo
这个类就是模拟一个队列,当然,在他里面也包含了扩容的算法。按需扩容的思想在整个程序中有很好地体现。具体的队列算法想来十分简单了。
这个类还有两个相关的类:syncFIfo和PersistentFifo,前者支持同步,后者支持同步和备份(文件存储),在具体的使用中再看他们的用途。
(4)%LARBIN_HOME%/src/utils/NameSite
这个类是一个比较重要的类,这个爬虫爬行过程的一些核心代码就在这里面。首先,它是一组站点的集合,他的成员变量分为两个部分:
网址部分:
char name[maxSiteSize]
uint16 port
队列部分:
uint16 nburl
url *fifo[maxUrlsBySite]
uint8 inFifo
uint8 outFifo
在队列中会保存一定量的url,当某个url需要被处理时,则将这个url取出,保存在网址部分的变量中。
在这个类的函数中,还包含一些DNS解析的功能,这些在流程分析中再谈。
(5)%LARBIN_HOME%/src/utils/IPSite
这个类和上面的类类似,不过他保存的就已经是IP地址了。这个类的结构略显简单,它里面也是包含一个fifo,在这个类中包含了一个功能函数,就是fetch,其实这个函数只是对待访问站点进行连接,并不做真正的内容读取。
还有一些类,比如string,text,hashTable,hashDup就不做介绍了,因为这些类的内容比较少,大家一看名字便知他的含义。
下一次将对Larbin的实现细节做一些分析。
首先从我接触到的第一个数据结构开始(因为我在详细阅读代码前首先做了些源代码修改工作)——Vector
(1)%LARBIN_HOME%/src/utils/Vector
这个类唯一值得一提的就是他的存储空间优化机制。这在大量的数据结构中都有。
它有两个成员变量:
uint pos;
uint size;
其中pos代表vector的使用容量,size代表vector的占用容量。
当占用容量不够用,vector就需要进行一次扩容。代码中是扩1倍容量,如果还不够,就扩到当前需要的量。
vector的使用处:大家应该还记得第2部分中,用户可以参与的程序部分。
也就是loaded()函数,他的参数是一个html。它里面包含一个vector用于存储当前页面指向的链接。如果需要输出特定的链接关系(用于PR)的话,那么就需要用到这个结构。
(2)%LARBIN_HOME%/src/utils/url
这个类主要处理url相关的一些基本问题。他的成员变量中包含Host,port等url的基础组成部分。
它的内部包含两个hashcode的算法,一个是求对整体url的hash值,一个是对Host求hash值。
这两个求值用在的地方也不太一样。在后面会详细介绍。
(3)%LARBIN_HOME%/src/utils/Fifo
这个类就是模拟一个队列,当然,在他里面也包含了扩容的算法。按需扩容的思想在整个程序中有很好地体现。具体的队列算法想来十分简单了。
这个类还有两个相关的类:syncFIfo和PersistentFifo,前者支持同步,后者支持同步和备份(文件存储),在具体的使用中再看他们的用途。
(4)%LARBIN_HOME%/src/utils/NameSite
这个类是一个比较重要的类,这个爬虫爬行过程的一些核心代码就在这里面。首先,它是一组站点的集合,他的成员变量分为两个部分:
网址部分:
char name[maxSiteSize]
uint16 port
队列部分:
uint16 nburl
url *fifo[maxUrlsBySite]
uint8 inFifo
uint8 outFifo
在队列中会保存一定量的url,当某个url需要被处理时,则将这个url取出,保存在网址部分的变量中。
在这个类的函数中,还包含一些DNS解析的功能,这些在流程分析中再谈。
(5)%LARBIN_HOME%/src/utils/IPSite
这个类和上面的类类似,不过他保存的就已经是IP地址了。这个类的结构略显简单,它里面也是包含一个fifo,在这个类中包含了一个功能函数,就是fetch,其实这个函数只是对待访问站点进行连接,并不做真正的内容读取。
还有一些类,比如string,text,hashTable,hashDup就不做介绍了,因为这些类的内容比较少,大家一看名字便知他的含义。
下一次将对Larbin的实现细节做一些分析。