【问题标题】:map vs multimap in C++ (performance)C ++中的地图与多地图(性能)
【发布时间】:2013-02-18 08:19:28
【问题描述】:

我正在研究数据结构,其中输入非常大,几乎 1 TB。我需要将数据加载到关联容器中。

数据有一些重复的整体,所以我使用的是 multimap,但有人建议我使用矢量地图而不是使用它。我可以知道性能方面的差异是什么吗?

 map<const char*, const char*, cmptr> mulmap;

 map <const char*, vector <const char*> ,cmptr> mmap;

【问题讨论】:

  • 你为什么不试试这两个,然后找出答案?
  • 实际上,在这两种情况下,您的性​​能都可能取决于磁盘速度,除非您的系统具有 1TB 的 RAM...
  • 如果您想使用const char* 作为键,您还必须提供一个比较谓词才能使其工作。改用std::map&lt;std::string, std::string&gt; 会更容易。
  • 请。我祈求你。如果您打算将其用作字符串,请不要使用const char*。请改用std::string。只是......请!
  • 我需要将 100 万个文件的内容存储到 map/multimap 中,并且需要应用我的算法来处理数据并打印输出。

标签: c++ dictionary


【解决方案1】:

您正在浪费时间考虑 mapmultimap。假设 bin 的数量为 N,每个 bin 的平均项目数为 M。

std::multimap&lt;Key, Val&gt; 通常使用带有重复键的 RB 树。

  • 获取时间为 O(log N + log M)
  • 插入为 O(log N + log M)
  • 删除是 O(log N + log M)
  • 迭代是 O(1)

std::map&lt;Key, std::vector&lt;Val&gt;&gt; 通常使用具有唯一键的 RB 树。

  • 获取是 O(log N)
  • 插入为 O(log N)
  • 删除是 O(log N)
  • 迭代是 O(1)

如您所见,除非 M 很大,否则差异不值得讨论。

但是,两者的存储都受到 RAM 的限制。 1 TB 对于大多数系统来说根本不可行,而且我听说没有主板支持它。

最好使用数据库来存储 1 TB 的数据。您可以为此任务选择几乎任何数据库。 Kyoto Cabinet 很简单,做你想做的事,但你也可以使用 PostgreSQL、MySQL、Sqlite、Dynamo、Redis、MongoDB、Cassandra、Voldemort...

【讨论】:

  • 对于“1 TB的数据”,实际上需要注意哪个数据库以及如何访问数据..有限制等等。
  • @user15662:我仍然推荐京都内阁而不是std:: 任何此类工作。
  • +1 @user15662 那么拥有坚如磐石的数据库后端应该是给定的。我同意迪特里希的观点。
  • 对于我们这些只有人类 ram 水平的人来说,我们可以期望 multimap 的性能大致相当于 map with vector?
  • @Carbon:取决于你想对数据做什么。一般来说,没有。但矢量通常是正确的选择。
【解决方案2】:

对于 1 TB 的输入,我都不会使用。很可能,您没有足够的 RAM。使用一些磁盘数据结构,例如B-tree

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 2018-03-29
    • 2011-12-25
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    相关资源
    最近更新 更多