处理一些遗留代码,我遇到内存问题主要是(我相信)广泛使用STL地图(特别是“地图地图”)。
我正在考虑将Boost flat_map作为可能的解决方案。有没有人对flat_maps有任何第一手经验,特别是在速度和/或内存使用方面有所改进?我当然意识到这可能非常依赖于存储的数据类型和存储方式,但仍然很好奇民间的实际体验。
有人能指出一些可靠的例子吗?
作为一个例子:这个地图的代码有几种情况;也就是说,该值是另一个地图的地图。
通过用一对向量替换“内部”映射,我将内存占用减少了10:1(3G到300M)。当然,这可能会减慢搜索速度,但对于这种特殊情况,它似乎并不重要。它涉及一天的重构和仔细测试。
Boost的flat_map听起来可能就像我需要的那样但除了Boost网站上的类描述之外我似乎无法找到更多。寻找一些第一手反馈。
答案 0 :(得分:2)
Boost' flat_map
是一个基于二叉树的地图实现,除了该二叉树存储为键值对的(排序)向量。
你基本上可以根据这个事实找出有关表现的答案(相对于std::map
:
在你的情况下 - 地图地图 - 你将会失去一些好处,因为你有一个带有指针的外部地图到内部地图(如果没有更多的间接层次);但平面地图至少可以帮助你减少这一点。此外,假设您有两个级别的地图,您可以对其进行排列,以便您连续存储所有内部地图 (通过适当地构建内部地图或通过使用您自己的分配器实例化它们,一个更棘手的事务);在这种情况下,您可以使用地图索引替换指向地图的指针,减少它们占用的空间量并使编译器的生活更轻松。
您可能还想阅读Boost' documentation of flat_map
;你也可以使用武力并阅读the source(以及source of the underlying flat_tree
) - 就像我一样;我实际上没有flat_map
亲自体验过。
答案 1 :(得分:1)
我知道这是一个老问题,但这可能对发现这个问题的人有用。
我发现flat_map
是搜索,查找和迭代大型地图的重大改进。地图在内存中使用连续数据这一事实也使得插入速度比您预期的更快,因为数据位置很好。如果您在地图中执行的插入次数多于查找次数,则可能不适合您。
话虽如此,由于数据的局部性,重复地将随机值插入到排序的向量中比链表上的更快 - 尽管Big O可能会告诉你。 (在VS2017和G ++ 4.8中测试)。