【发布时间】:2013-02-21 22:38:27
【问题描述】:
在处理一些遗留代码时,我遇到了内存问题,这主要是由于(我相信)广泛使用 STL 映射(尤其是“maps-of-maps”)。
我将 Boost flat_map 视为一种可能的解决方案。有没有人对 flat_maps 有任何第一手经验,特别是在速度和/或内存使用方面的改进方面?我当然意识到这可能非常依赖于存储的数据类型和存储方式,但仍然对人们的实际体验感到好奇。
谁能指点我一些可靠的例子?
举个例子:这个map-of-a-map的代码有几种情况;也就是说,值是另一个映射的映射。
通过用一对向量替换“内部”映射,我将内存占用减少了 10:1(3G 到 300M)。当然,这会减慢搜索速度,但对于这种特殊情况,这似乎并不重要。它涉及大约一天的重构和仔细测试。
Boost 的 flat_map 听起来可能正是我所需要的,但除了 Boost 网站上的类描述之外,我似乎找不到太多关于它的信息。寻找一些第一手反馈。
【问题讨论】:
-
“内存问题”是什么意思?你能说得更具体点吗?
-
内存过多。还有其他种类吗?说真的,我已经使用 flat_map 运行了一些测试,它似乎对我的目的有用。它在内存方面不如使用一对向量那么有效,但几乎一样好,而且更容易重构。
-
您可以检查一些事情:您是否在收集垃圾(意思是,您是否从地图中删除索引,而不仅仅是将其设置为 0)?您是否可以通过将您的类型表示为较小的类型来节省空间(例如,如果您有很多重复的字符串,请使用枚举而不是字符串)?
-
this post 可能会有所帮助(请参阅回答中的 cmets)
-
如果您存储在向量中的数据已排序(或可以排序),那么您可以使用 std::lower_bound() 而无需稍作改动。这会进行 O(log N) 的二进制搜索。对于某些值类型,这类似于 boost::flat_map 的性能。