繁体   English   中英

C/C++ MultiMap 库

[英]C/C++ MultiMap Library

我存储了 1.11 亿个键值对(一个键可以有多个值 - 最大 2/3),其键是 50 位整数,值是 32 位(最大)整数。 现在,我的要求是:

  1. 快速插入(键,值)对[允许重复]
  2. 基于键快速检索值/值。

是否有解决此问题的 C/C++ 库(使用 MultiMap、B+ 树、B 树、R+ 树等)? 我可以为此提供 5/6 GB 主 memory。 欲了解更多信息: 我以前的帖子

C 中的普通哈希表每个元素需要 50+32 (+14padding) + 32 +32 位。 (+ 可能是 32 位对齐)。 即每个元素 160(或 192)位:= 每个元素 20(或 24)字节。 hash 表将花费 memory 的 111*20(或 111*24)兆字节。即 2.2GB 或 2.7GB。

您的要求不包括对有序集合的任何需求。 使用一个hash map。如果你找不到现成的,创造一个不是很大的挑战。

因为“5/6 GB”实际上意味着 5 或 6 GB...

具有 50 位键和 32 位值的 111000000 个键/值对将采用 (111000000 * (50+32))/(8*1024*1024*1024) = 1.05 GB 或 memory 当存储为紧密压缩的(位)数组时。

你有 5 倍的 memory 那么。

在 64 位系统上基于 10 级深度跳跃列表的 map 在最坏的情况下将占用 (111000000 * (64+32+10*16))/(8*1024*1024*1024) = 3.308 GB,你仍然会有超过 GB 的 RAM 来处理堆管理开销。

所以我建议抓住任何可用的多图并尝试使用它 - 在我看来你有足够多的 memory 来处理你的情况而无需使用任何额外的技巧。

- 编辑 -

其实我不懂C/C++

那么,如果您不知道 C++,您希望如何使用包含 111000000 个键的地图? 你将不得不做一些阅读。

标准库包括 std::multimap,boost 库中有几个类。 Qt 4 包括基于跳过列表的QMap。 尝试使用其中任何一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM