gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:23 25 4
gpt4 key购买 nike

我已经创建了一个 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

无序 map 似乎占用了 250MB 的空间。这似乎异常高。为什么会这样。同样的代码加上google sparse hash只占用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com