假设有一个流行的网络服务器,这个网络服务器的访问次数可以在一小时内成千上万,为了分析这些访问的统计属性,我们想知道特定的请求数量时间范围和IP范围。
例如,我们有以下格式的10个 12 请求:
(IP地址,访问时间)
假设我们想知道在下午2点和下午4点从IP范围[10.12.72.0,10.12.72.255]访问了多少次。
我能想到的唯一候选人是:
(1)使用B-TREE使用一维索引这个大数据集,例如在参数IP上构建B-TREE。使用这个B-TREE,我们可以快速获得来自任何特定IP范围的请求数量,但我们怎么能知道这些访问中有多少是在下午2点到下午4点之间?
(2)使用BITMAP,但与B-TREE类似,由于空间要求,BITMAP只能在一个维度上构建,例如IP地址,我们不知道在2p之间发出了多少这些请求。下午4点和下午4点。
有没有高效的算法,thx?查询数量可能非常大
答案 0 :(得分:2)
您需要一个支持orthogonal range counting的数据结构。
答案 1 :(得分:2)
你的第一步是弄清楚你需要的精确度......
时间:
IP:
假设:
重新组织您的数据(2种可能的结构选择一种):
数据库:
平面文件:
如何加载新数据结构:
数据库:
平面文件:
查询新数据结构:
数据库:
平面文件:
一些额外提示:
答案 2 :(得分:0)
10 ^ 12是一个大数字(TERA) - 对于内存处理来说肯定太大了。 我会将其存储在具有星型模式的关系数据库中,使用时间维度,并按时间(例如小时波段),IP子网和您感兴趣的其他条件进行预聚合。