【发布时间】:2017-06-26 03:00:32
【问题描述】:
问题
我发现使用 map.clear() 和 map.rehash(0) 不会从我的 RAM 中释放预期的内存。
我用以下代码创建了一个程序:
int main() {
std::unordered_map<std::string, int> m1;
std::unordered_map<std::string, int> m2;
// fill the maps m1 and m2 with 5 million elements
// bucket_count = 5098259; size = 5000000
// now I clear m1
m1.clear();
m1.rehash(0);
// m1: bucket_count = 2; size = 0
// m2: bucket_count = 5098259; size = 5000000
// now I clear m2
m2.clear();
m2.rehash(1);
// m1: bucket_count = 2; size = 0
// m2: bucket_count = 2; size = 0
}
根据程序每一步之后的bucket_count和size,似乎有很多空间正在从RAM中释放出来。但是,检查与系统监视器一起使用的 RAM,我得到以下 evolution
问题
即使在清除和重新散列两个映射之后,内存也只有在程序完成时才会释放。实际上,内存释放很少,但我不确定这是否可以在图片中看到。怎么可能?
我怎样才能真正从 RAM 中释放内存?
上下文
我正在使用动态规划算法来解决 Linux 中 4Gb RAM 的旅行商问题。由于内存不足而崩溃,所以我正在尝试优化程序使用的内存。
经过一些改进后,我保留了两个unordered_map:
- costs:存储上一次迭代的值
- new_costs:在该迭代期间构建。
迭代结束后,我交换它们以便 costs 具有新的计算值,我清除 new_costs trying 以释放内存并开始构建下一个迭代。
代码是这样的:
std::unordered_map<std::string, int> costs(5098259);
std::unordered_map<std::string, int> new_costs(5098259);
for (int m = 1; m <= n; m++) {
new_costs.clear();
new_costs.rehash(5098259);
while (something) {
// I build the content of new_costs based on the content of costs
}
std::swap(costs, new_costs);
}
我最多只能分别在其中存储 2496144 和 2704156 个元素。这使得同时存储总共 5200300 个元素。假设键是一个最多包含 70 个字符 --71 个字节的字符串,而存储的值是一个浮点数 --4 个字节--,我将存储大约 380 Mb。
我知道unordered_map 的内存效率不高,但程序完全使用了我的 RAM 和交换内存,所以我一定遗漏了一些东西。
**为可能的重复编辑
How do I force my std::map to deallocate memory used?
我用C++有一个多星期了,不知道std::map和std::unordered_map的内存管理是否一样,或者两者之间是否存在相关差异。
我也不知道deallocate的意思是不是和释放一个对象使用的内存完全一样,所以有更多的RAM可用。
如果两者相同,我基本上问的是同一个问题。但是,无论如何,该问题的答案是解释内存保留背后的原因,而不是提供解决方案。
【问题讨论】:
-
你试过用空容器交换它吗?
-
运行时可能会保留内存以供以后可能重用,而不会将其返回给操作系统。特别是如果您分配了许多小内存单元。
-
确实,实际上我很高兴它通过设计保留了它的内存,并且对于某些容器保留的实现正是这样做的。在许多情况下,内存分配/释放太慢了。如前所述,只需在此处使用 std::swap 即可真正释放您的内存。
-
我很惊讶这不是重复的,但我找不到合适的匹配。
-
您的图表显示您的内存消耗有限。您的评论声称您的内存无限增长,导致处决。这两种说法不能同时成立。请判断哪一个是正确的。如果图表是正确的,那么你做的一切都是正确的,没有什么可担心的。如果评论是正确的,那么你做错了什么。我们无法确切知道是什么,但很可能不是您的想法。发布您的整个程序,以便我们识别和讨论未知的错误。
标签: c++ memory memory-management memory-leaks