我有一个程序,它使用动态规划来计算一些信息。问题是,理论上使用的内存呈指数增长。我使用的一些过滤器限制了这个空间,但对于大输入,它们也无法避免我的程序耗尽 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 使用率急剧下降。
最佳答案
如果您有 1 Gb 的 RAM 并且您有一个程序使用了 2 Gb 的 RAM,那么您将不得不找到其他地方来存储多余的数据..显然。默认的操作系统方式是交换,但另一种方法是使用内存映射文件来管理您自己的“交换”。
您打开一个文件并在其中分配一个虚拟内存块,然后将该文件的页面放入 RAM 中进行处理。操作系统在很大程度上为您管理这一点,但您应该考虑您的内存使用情况,如果可以的话,不要试图在内存中访问相同的 block 。
在 Windows 上使用 CreateFileMapping(),在 Linux 上使用 mmap(),在 Mac 上使用 mmap() .
关于c++替代实现以避免在RAM和SWAP内存之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23952187/