c++ - 无序 map 占用大量空间

标签 c++ unordered-map

我已经创建了unit64_t到uint64_t的映射。这是我为评估空间复杂度而编写的代码:

#include <bits/stdc++.h>
#include "sparsehash/internal/sparseconfig.h"
#include "sparsehash/sparse_hash_map"

using namespace std;

int main(int argc, char *argv[]){

    std::string input,reference;

    while (getline(cin,input)) {
    reference += input;
    input.clear();
    }

    cout<<"length of reference = "<<reference.length()<<endl;
    unordered_map<uint64_t, uint64_t> m;
    //google::sparse_hash_map<uint64_t, pair<short,long>> m;

    for (auto it = reference.begin(); it != reference.end(); it++) {
        m[it-reference.begin()]= it-reference.begin();
    }

    return 0;
}

当我使用/usr/bin/time 运行此命令时,这是程序产生的输出:

length of reference = 4641652
    Command being timed: "./a.out"
    User time (seconds): 2.97
    System time (seconds): 0.15
    Percent of CPU this job got: 99%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:03.13
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 251816
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 68259
    Voluntary context switches: 1
    Involuntary context switches: 104
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

无序映射似乎占用了 250MB 的空间。这似乎异常高。为什么会出现这种情况。与google稀疏哈希相同的代码只需要89MB的空间,比较合理。

我不明白为什么C++无序映射占用这么多空间?

最佳答案

您有 4641652 条目。因此原始数据总大小为 4641652*2*8 字节 ~= 74 MB

关于哈希表有一个重要的事实。哈希桶数量多的哈希表速度快,哈希桶数量少的哈希表速度慢。

这基本上都归结为哈希冲突。如果你有很多哈希桶(并且你有一个很好的哈希函数),那么哈希冲突就很少发生。因此查找速度真的非常快。 另一方面,如果您的表很小(哈希桶不多),则哈希冲突会定期发生。因此查找功能要慢得多。

现在,std::unordered_map 被设计为快速哈希表,因此它有相当多的开销。哈希桶的数量比条目多得多。在这种情况下,开销约为 250/74 ~= 3.3x,这似乎很正常。

但是 sparsehash 的设计目标是尽可能减少开销(每个条目大约 2 位)。但这当然意味着速度要慢得多。

如果您使用 HashMap ,您应该始终考虑是想要速度还是想要提高内存效率。

关于c++ - 无序 map 占用大量空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32898965/

相关文章:

c++ - unordered_map vs vector + 少量元素的自定义散列

c++ - std::unordered_map 使用 Visual C++ 2008 的未声明标识符

c++ - 防止控制台窗口在 Visual Studio 2017 cmake 项目中关闭

c# - C++ dll 返回的字符串在 C# 调用程序中已损坏,为什么?

php - 将参数从 C++ 传递到 PHP

C++:使用 boost unordered_map 错误:没有匹配的函数调用

c++ - 将 "int Triplets"映射到 int?

c++ - 访问带有额外参数的 boost 变体

c++ - 如果映射键/值不改变,std::map 迭代器输出顺序将保持不变?

c++ - unordered_map : what to return if key is not in map?