【发布时间】:2014-05-30 10:15:57
【问题描述】:
我有一个程序,它使用动态规划来计算一些信息。问题是,理论上使用的内存呈指数增长。我使用的一些过滤器限制了这个空间,但是对于大量输入,它们也无法避免我的程序耗尽 RAM - 内存。
程序在 4 个线程上运行。当我以非常大的输入运行它时,我注意到,在某些时候程序开始使用交换内存,因为我的 RAM 不够大。这样做的结果是,我的 CPU 使用率从大约 380% 下降到 15% 或更低。
只有一个变量使用内存,它是以下数据结构:
使用CLN library编辑(添加类型):
class My_Map {
typedef std::pair<double,short> key;
typedef cln::cl_I value;
public:
tbb::concurrent_hash_map<key,value>* map;
My_Map() { map = new tbb::concurrent_hash_map<myType>(); }
~My_Map() { delete map; }
//some functions for operations on the map
};
在我的主程序中,我使用这个数据结构作为全局变量:
My_Map* container = new My_Map();
问题:
有没有办法避免内存在 SWAP 和 RAM 之间转移?我认为将所有内存推送到Heap 会有所帮助,但似乎没有。所以我不知道是否有可能完全使用交换内存或其他东西。只是这种记忆的转移花费了很多时间。 CPU 使用率急剧下降。
【问题讨论】:
-
您的程序是否可能存在内存泄漏?我看到您使用内存泄漏运算符 (
new) 而不是自动内存管理,所以也许您在很多其他地方也这样做了。 -
也许减少线程数可以将内存消耗减少4倍?当问题从 cpu-bound 转移到 memory-bound 时,更多线程会降低性能。
-
购买更多的内存也有帮助。
-
垃圾收集器可能是个好主意。 @user2079303 取决于输入,更多的 RAM 也无济于事。
-
垃圾收集器不是魔法。当您使用
new时,您必须使用delete。
标签: c++ memory memory-management heap-memory