(按:这个算法的意思没看大懂,先写出来,欢迎各位批评指正!)
书接前文,虚拟位图法为改进直接位图法内存使用过大的缺陷提出。基本思想是,仅存贮直接位图的一小部分,根据这一小部分的计数值推测总的计数值。
什么意思呢?我的理解是,假设以源/目的地址作为FLOW_ID,则统计空间为264。采用直接位图算法时,设位图长度为226bit=8M,空间浪费大,但取太小的值可能HASH碰撞会加剧,影响统计结果准确度。此时采用虚拟位图算法,取长度为220bit=128k,大小为直接位图法的1/64在计数时,HASH函数取值空间仍为0~226-1,在虚拟位图空间(0~220)内的值,给相应位置bit置1,不在空间内则不管。最终,统计128k虚拟位图空间bit为1的总数,再乘以64,最终值为推测出的总流数。
二者相比,直接位图法实质是虚拟位图法的一般形式,它覆盖了整个FLOW_ID空间,而虚拟位图仅覆盖了一部分。
在设计虚拟位图时,必须在预知流数的基础上考虑所谓的“抽样因子”,即上文中的1/64,如果该因子与设计者预计的相差太远,将造成统计结果严重失真。
如果流太多以致于将位图填满,则虚拟位图的统计结果不再可信;同时,如果流太少,HASH(FLOW_ID)的值无法映射到虚拟位图上,则结果仍不可信。例如,设虚拟位图覆盖了统计空间的1%,而流数为50,如果没有流被映射到虚拟位图上,统计将得出流数为0的结论;如果有1个被映射到虚拟位图上,统计将得出流数为100的结论,显然与实际数目相差太远。
因此,“抽样因子”要在HASH冲突和推测失误二者间取折衷。
参考文献:Bitmap algorithms for counting active flows on high speed links