在经过大量计算后减小C++程序的堆大小

Reducing the heap size of a C++ program after large calculation

本文关键字:C++ 程序 经过 计算      更新时间:2023-10-16

考虑一个基于两个步骤的MPI应用程序,我们将调用loadglobalReduce。为了简单起见,软件被描述为这样,但还有很多事情要做,所以这不仅仅是一个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,.))