提升flat_map容器

Boost flat_map container

本文关键字:容器 map flat 提升      更新时间:2023-10-16

在处理一些遗留代码时,我遇到了内存问题,主要原因是(我相信)STL映射的广泛使用(特别是" map -of-map ")。

我正在寻找Boost flat_map作为一个可能的解决方案。有没有人有使用flat_maps的第一手经验,特别是在速度和/或内存使用方面的改进?当然,我意识到这可能非常依赖于存储数据的类型和存储方式,但我仍然对人们的实际经验感到好奇。

谁能给我指出一些可靠的例子?

作为一个例子:在这段代码中有几种map of a-map的情况;也就是说,一个值为另一个映射的映射。

通过用一对向量替换"内部"映射,我减少了10:1的内存占用(3G到300M)。当然,这可能会减慢搜索速度,但对于这种特殊情况,这似乎无关紧要。它涉及了大约一天的重构和仔细的测试。

Boost的flat_map听起来可能正是我需要的,但除了Boost网站上的类描述外,我似乎找不到更多关于它的信息。寻找一些第一手的反馈

Boost的flat_map是一个基于二叉树的映射实现,除了二叉树是作为键值对的(排序)向量存储的。

基于这个事实,你基本上可以自己找出关于性能的答案(相对于std::map):

  • 迭代地图或它的大部分应该是超快的,相对
  • 查找通常应该相对较快
  • 添加或删除值理论上要慢得多,但在实践中-假设您的键和值类型很小并且地图元素的数量不是很高-可能在速度上相当(或者在小地图上甚至更好-通常不需要在插入时分配)
  • 等。

在你的例子中-map -of-maps -你将失去一些"平坦化"的好处,因为你将有一个指向内部地图的指针的外部地图(如果不是更多的间接层次);但平面地图至少可以帮助你减少这种情况。此外,假设你有两层映射,你可以安排它,以便你存储所有的内部映射连续(要么通过适当地构造内部映射,要么通过用你自己的分配器实例化它们,这是一个更棘手的事情);在这种情况下,您可以用映射索引替换指向映射的指针,减少它们占用的空间,使编译器的工作更轻松。

您可能还需要阅读Boost的flat_map文档;你也可以像我一样使用力来读取源(以及底层flat_tree的源);我自己其实没有flat_map的经验。

我知道这是一个老问题,但这可能对找到这个问题的人有用。

我发现flat_map在搜索、查找和迭代大型地图方面有很大的改进。map使用内存中的连续数据这一事实也使得插入速度比您预期的要快,因为它具有良好的数据局部性。如果你在地图中做的插入多于查找,那么它可能不适合你。

话虽如此,由于数据的局部性,反复插入随机值到排序向量中比在链表中更快——尽管大O可能会告诉你什么。