【问题标题】:Data Structure to store billions of integers存储数十亿整数的数据结构
【发布时间】:2010-11-15 00:27:08
【问题描述】:

在内存(RAM)中存储数百万/数十亿条记录(假设记录包含名称和整数)的最佳数据结构是什么。 最好的 - 最短搜索时间(第一优先级)和内存效率(第二优先级)?是帕特里夏树吗?还有比这更好的吗?

搜索关键字是整数(比如 32 位随机整数)。并且所有记录都在 RAM 中(假设有足够的 RAM 可用)。

在 C 中,平台 Linux..

基本上我的服务器程序为用户分配了一个32位的随机密钥,我想存储相应的用户记录,以便我可以有效地搜索/删除记录。可以假设数据结构将被很好地填充。

【问题讨论】:

  • 您搜索的是姓名还是号码?还是两者兼而有之?
  • 记录集是否经常更新,更新的程度如何?整数的分布是什么样的?包含所有名称的哈希表是否可以轻松放入您可用的内存中?

标签: c linux performance data-structures record


【解决方案1】:

我们可以使用每个节点都是 1/0 的 trie 来存储整数值。这样我们可以确保树的深度是 32/64,因此获取时间是恒定的,并且具有亚线性空间复杂度。

【讨论】:

    【解决方案2】:

    如果您只想通过整数键检索,那么简单的哈希表是最快的。如果整数是连续的(或几乎连续的)且唯一的,那么一个简单的数组(指向记录的指针)会更快。

    如果使用哈希表,您希望为预期的最终大小预先分配哈希表,这样它就不会重新哈希。

    【讨论】:

      【解决方案3】:

      您至少可以使用基数来代替散列。

      对于任何特定问题,您都可以比 btree、哈希表或帕特里夏树做得更好。更好地描述问题,我们可以提出可行的建议

      【讨论】:

        【解决方案4】:

        我有根据的猜测是B-Tree(但我可能是错的......):

        B-trees 有很大的优势 在替代实现时 节点访问时间远远超过访问 节点内的时间。这通常 当大多数节点处于 辅助存储,例如硬盘驱动器。 通过最大化孩子的数量 每个内部节点内的节点, 树的高度降低, 平衡发生的频率较低,并且 效率提高。通常这个 设置值使得每个节点都取 一个完整的磁盘块或类似的 二级存储中的大小。而 2-3 B-trees 可能在 main 中很有用 记忆,当然更容易 解释一下,如果调整了节点大小 到一个磁盘块的大小, 结果可能是 257-513 B 树 (其中尺寸与较大的 2) 的幂。

        【讨论】:

          【解决方案5】:

          视情况而定。

          您要搜索名称还是整数?

          名字的大小都差不多吗?

          所有的整数都是 32 位,还是一些大数字?

          你确定这一切都适合记忆吗?如果不是,那么您可能会受到磁盘 I/O 的限制,并且内存(或磁盘使用)不再是问题。

          索引(名称或整数)是否有共同的前缀或者它们是均匀分布的?只有当它们有共同的前缀时,帕特里夏树才有用。

          您是按顺序查找索引(群查找)还是随机查找?如果一切都是统一的、随机的并且没有公共前缀,那么哈希就已经是最好的了(这很糟糕)。

          如果索引是使用 gang 查找的整数,您可能会查看基数树。

          【讨论】:

          • 很多问题都可以放在 ram 中。昨天我以不到 2 万欧元的价格配置了 96 GB 内存的戴尔
          • 数据是动态的吗?您对插入/删除速度的重视程度如何?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-17
          • 1970-01-01
          相关资源
          最近更新 更多