c++替代实现以避免在RAM和SWAP内存之间切换

标签 c++ memory memory-management heap-memory

我有一个程序,它使用动态规划来计算一些信息。问题是,理论上使用的内存呈指数增长。我使用的一些过滤器限制了这个空间,但对于大输入,它们也无法避免我的程序耗尽 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/

相关文章:

c++ - 将自定义类与自定义模板容器一起使用

c++ - Embarcadero TThread : Pass TThreadMethod in C++

python - 如何连接多个 pandas.DataFrames 而不会遇到 MemoryError

JavaScript 导致大量内存泄漏

c# - 分配内存时线程争用

c++ - 如何在没有库的情况下在 C++ 中初始化套接字

c++ - lambda 函数的类型

Java 内存指南

c - 检查字符数组是否为零的快速方法

c++ - 是否可以在其范围之外访问局部变量的内存?