磁盘

时间:2018-02-18 12:22:39

标签: algorithm data-structures disk radix-tree

我目前有一些实现从基数树数据结构执行最长前缀查找(LPM)。此数据结构包含IP前缀(最大深度为128位的基数树),并且它当前完全保留在内存中。数据是只读数据,永远不会被修改。

不幸的是,数据变得更大,我不再能够将其保存在内存中。我正在寻找一种有效的数据结构,可以保存在磁盘上,并提供有效的查找。我计划在它上面使用一些缓存机制。

1 个答案:

答案 0 :(得分:1)

  

高效的数据结构,可以保存在磁盘上并提供有效的查找

对我来说看起来像XY Problem

  1. 我们谈论的是IPv6(128位)。
  2. 我们正在讨论IPv6路由(最长前缀匹配)。
  3. 对于10 Gbit / s链路,每秒最多可能有1,480万次路由查找。
  4. 根据public data,目前有大约50K的IPv6前缀。
  5. 如果上面假设的那些是正确的,我们需要在基数树中存储50K乘以128位= 800KB。 它应该很容易融入记忆中。

    我们需要每秒数百万次查找此数据。将数据放入磁盘是一个数量级的减速。

    我的猜测是您的问题不是您的根本问题,所以请:

    1. 包括有关更广泛图片的信息以及任何尝试的解决方案。
    2. 如果您已经排除了其他解决方案,请分享您排除它们的原因。这提供了有关您的要求的更多信息。
    3. 更新

      因此,对于只读的20M IPv6前缀集,每小时的IPv6查询次数为2M。我们仍然不知道那些20M前缀是什么,因为从实际的角度来看,整个互联网中没有那么多的前缀。但无论如何。

      1. 2M查询/小时进行~550次查找/秒。 According to Wikipedia,传统(机械)硬盘驱动器无法承受这样的负载。所以我们需要一个SSD驱动器来存储数据库。

      2. According to Wikipedia,B树是外部搜索的良好结构。

      3. According to Wikipedia,内存映射文件即使对于非常大的文件也会使用少量RAM。

      4. 将所有位放在一起。这些20M IPv6前缀应组织为节点大小为PAGE_SZIE(通常为4KB)的B树,并映射到进程的虚拟地址空间。缓存将由操作系统管理,因此不需要其他缓存机制。