【问题标题】:comparison of speed and memory速度和内存对比
【发布时间】:2018-05-11 07:48:48
【问题描述】:

我有数十亿个标签。这些标签最多包含大约 20 个从 1 到 500 的整数。我需要在每个标签中搜索每个整数的存在,并可能将整数插入标签。我也有内存限制。所以在某些情况下我需要删除标签以释放内存。 哪一个更好? 使用vector保存标签数据还是使用unordered_set?

【问题讨论】:

  • 显示数据结构的一些代码(或其中的一部分)可能会有所帮助
  • 这些整数的顺序重要吗?如果不是,std::bitset 可能是一个答案,因为每个标签只需要大约 500 位,并且能够为每个标签添加/检查 O(1) 处的每个整数。
  • 让我们考虑两种可能的情况。 1)顺序无关紧要,不允许重复成员 2)我们可以重复,也可以顺序。
  • 请提供minimal reproducible example。当您有许多标签并且每个标签包含许多整数时,尚不清楚 vector 和 unordered_set 是如何替代的
  • 顺便说一句,回答这个问题的唯一方法是尝试两种方法并进行比较

标签: c++ performance memory


【解决方案1】:

正如其中一个 cmets 中已经暗示的那样:

std::bitset 将占用比 20 个整数更少的空间,并给出O(1) 添加/检查。这是一个好主意,如果每个标签平均有超过 15 个值,或者可以忍受一些额外的内存使用。

如果没有,我建议使用vector over set。

  • 它在内存中对齐(缓存未命中次数更少 => 更快)
  • 内存占用更小
  • 如果你有批量插入,你可以reserve()
  • 如果您的向量已排序,您可以使用std::binary_search 进行O(log n) 查找

根据经验:如果您的元素少于 50 个,则 vector 是您的首选容器。

据我所知,关键操作是找到所有包含特定值的标签?

  • 您是否考虑过翻转结构?而不是将整数存储在 每个标签,为什么不列出每个标签的引用列表 你的 500 个价值观?
  • 您是否考虑过使用(no-sql)数据库来摆脱内存限制?

【讨论】:

    猜你喜欢
    • 2018-05-18
    • 1970-01-01
    • 2018-07-14
    • 2015-08-10
    • 2011-02-20
    • 2012-08-02
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多