我目前有一些实现从基数树数据结构执行最长前缀查找(LPM)。此数据结构包含IP前缀(最大深度为128位的基数树),并且它当前完全保留在内存中。数据是只读数据,永远不会被修改。
不幸的是,数据变得更大,我不再能够将其保存在内存中。我正在寻找一种有效的数据结构,可以保存在磁盘上,并提供有效的查找。我计划在它上面使用一些缓存机制。
答案 0 :(得分:1)
高效的数据结构,可以保存在磁盘上并提供有效的查找
对我来说看起来像XY Problem:
如果上面假设的那些是正确的,我们需要在基数树中存储50K乘以128位= 800KB。 它应该很容易融入记忆中。
我们需要每秒数百万次查找此数据。将数据放入磁盘是一个数量级的减速。
我的猜测是您的问题不是您的根本问题,所以请:
因此,对于只读的20M IPv6前缀集,每小时的IPv6查询次数为2M。我们仍然不知道那些20M前缀是什么,因为从实际的角度来看,整个互联网中没有那么多的前缀。但无论如何。
2M查询/小时进行~550次查找/秒。 According to Wikipedia,传统(机械)硬盘驱动器无法承受这样的负载。所以我们需要一个SSD驱动器来存储数据库。
According to Wikipedia,B树是外部搜索的良好结构。
According to Wikipedia,内存映射文件即使对于非常大的文件也会使用少量RAM。
将所有位放在一起。这些20M IPv6前缀应组织为节点大小为PAGE_SZIE
(通常为4KB)的B树,并映射到进程的虚拟地址空间。缓存将由操作系统管理,因此不需要其他缓存机制。