在经过大量计算后减小C++程序的堆大小
Reducing the heap size of a C++ program after large calculation
考虑一个基于两个步骤的MPI应用程序,我们将调用load和globalReduce。为了简单起见,软件被描述为这样,但还有很多事情要做,所以这不仅仅是一个Map/Reduce问题。
在加载步骤中,每个给定节点中的所有列都将排队,以便只有一个列可以完全访问节点的所有内存。这种设计的原因是,在加载阶段,有一组大型IO块正在读取,并且在发生局部还原之前,它们都需要加载到内存中。我们将把这个局部约简的结果称为命名变量myRankVector。一旦获得myRankVector变量,就会释放IO块。变量myRankVector本身使用的内存很少,因此在创建过程中,节点可以使用所有内存,完成后,秩只需要使用2-3GB来保存myRankVector。
在节点中的globalReduce阶段,预计节点中的所有列组都已加载相应的globalReduce。
所以这是我的问题,虽然我已经确保绝对没有任何内存泄漏(我使用共享指针编程,我用Valgrind进行了双重检查,等等),但我确信即使在所有析构函数都释放了IO块之后,堆仍然是扩展的。当队列中的下一个列开始执行任务时,它开始像前一个列一样请求大量内存,当然,程序会得到Linux终止,结果是"内存不足:终止进程xxx(xxxxxxxx)得分xxxx或牺牲孩子"。很明显,为什么会出现这种情况,队列中的第二个列想要使用所有内存,而第一个列仍然有一个大堆。
那么,在设置了这个问题的上下文之后:是否有一种方法可以手动减少C++中的堆大小,以真正释放未使用的内存?
谢谢。
堆是在linux上使用mmap实现的,您需要使用自己的堆,您可以完全处理和munmap。
munmap
将释放所需的空间。
看看boost:pool中的代码,它将允许您独立管理底层堆。
根据我的经验,使用自定义分配器管理std
容器非常困难,因为它们是类派生的,而不是实例派生的。
那么,在设置了这个问题的上下文之后:是否有一种方法可以手动减少C++中的堆大小,以真正释放未使用的内存?
这取决于操作系统,但很可能是不可能的。
大多数操作系统都会从一个进程中分配内存,直到该进程完全完成并终止。
共享内存能否解决您的问题(即使您不想共享此内存)?您可以在"加载"阶段分配一块共享内存,并在计算"myRankVector"后取消连接。
(参见shmget、shmat、shmdt、shmctl(…,IPC_RMID,.))
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- 使用mongocxx驱动程序时包含头文件问题
- 如何在c++程序中找到函数的地址