hashmap的内存高效数据结构(c ++)

时间:2015-09-21 10:01:59

标签: c++ memory-management hashmap

情景有点简单。

我得到一个值,范围在0 and 2^x (x~27)之间。现在我想将此值也用作hashmap的键。然后在hashmap中我只存储一个索引(值的来源)。 x可能也大于27,所以我必须使用内存有效的数据结构 我首先尝试了一个unordered_multimap,但是开销很大,不合格。然后我尝试了一个无序的矢量图。但是通过增加地图中的向量数量,开销也太大了。所以我想到只使用二维数组重新分配动态大小 但正如我在stackoverflow上学到的那样,调用2 ^ 27次“malloc()”也会产生开销,所以我尝试了这个:

uint64_t length = (uint64_t) pow(2.0,27);
uint64_t ** hashmap;
hashmap = (uint64_t **) malloc(sizeof * hashmap * length);
uint64_t * values = (uint64_t *) malloc(sizeof * values * 3 * length);


for(int i = 0;i<length;i++)
    hashmap[i] = values + 3 * i;

//Destroys the whole datastructure
hashmap[0] = (uint64_t *) realloc(hashmap[0],sizeof*hashmap[0]*4);

我分配3 * siezof * values来跟踪存储桶的实际长度和最大长度。
但正如评论所说,重新分配会破坏整个阵营,也许是因为指针上没有簿记(通过malloc)它只存储了3个元素? 有没有办法对这个结构进行重新分配?或者你甚至为我的意图知道一个更好的结构?

编辑dau_sama的原因答案:

在使用以下代码时,我发现了性能问题(运行时和内存):

std::unordered_map <uint64_t, std::vector<uint64_t>> m;
uint64_t length = 1UL<<22;
for(int i = 0 ; i<length;i++)
{
    m.emplace(i,vector<uint64_t>());
    m.at(i).push_back(i);
}

我将长度缩短为2 ^ 22,因为我在7分钟的运行时间和~8GB的内存使用量中止了2 ^ 27实现。
此代码段的运行时间为60秒,内存使用量为~1.7GB。与上面的阵列实现相比,数组占用了大约4GB的内存,运行时间为1.7秒(2 ^ 27个元素)。也许我做错了什么?

1 个答案:

答案 0 :(得分:0)

它很简单: 不要重新发明轮子,有一个std::unordered_map<int, int>来映射你需要的东西。你了解指针很好,但实际上你不需要直接调用malloc大多数情况。