gpt4 book ai didi

c++ - 利用大 vector 减少 C++ 程序的内存占用

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:21 38 4
gpt4 key购买 nike

在扩大问题规模时,我交给了一个自编码程序,我开始遇到 Linux 的 OOM killer 。 Valgrind(在 CPU 上运行时)和 cuda-memcheck(在 GPU 上运行时)都不会报告任何内存泄漏。在迭代内部循环时,内存使用量不断扩大,而我在循环结束时显式清除了保存最大数据 block 的 vector 。我怎样才能确保这种内存占用现象消失?

已执行内存泄漏检查,所有内存泄漏均已修复。尽管如此,内存不足错误仍然会终止程序(通过 OOM Killer)。手动监控内存消耗显示内存利用率有所增加,即使在显式清除包含数据的 vector 之后也是如此。

要知道的关键是具有三个嵌套循环,其中一个外部包含手头的子问题。中间循环在蒙特卡洛试验上循环,内部循环运行试验内所需的一些顺序过程。伪代码如下:

std::vector<object*> sub_problems;

sub_problems.push_back(retrieved_subproblem_from_database);

for(int sub_problem_index = 0; sub_problem_index < sub_problems.size(); ++sub_problem_index){
std::vector< std::vector<float> > mc_results(100000, std::vector<float>(5, 0.0));
for(int mc_trial = 0; mc_trial < 100000; ++mc_trial){
for(int sequential_process_index = 0; sequential_process_index < 5; ++sequential_process_index){
mc_results[mc_trial][sequential_process_index] = specific_result;
}
}

sub_problems[sub_problem_index]->storeResultsInObject(mc_results);
// Do some other things
sub_problems[sub_problem_index]->deleteMCResults();
}

deleteMCResults 如下所示:

bool deleteMCResults() {
for (int i = 0; i < asset_values.size(); ++i){
object_mc_results[i].clear();
object_mc_results[i].shrink_to_fit();
}
object_mc_results.clear();
object_mc_results.shrink_to_fit();
return true;
}

如何确保内存消耗完全依赖于中循环和内循环而不是外循环?第二次、第三次和第四次等等理论上可以使用与第一次迭代完全相同的内存空间/地址。

最佳答案

也许我读的伪代码太字面意思了,但看起来您有两个 mc_results 变量,一个在 for 循环内声明,另一个 deleteMCResults 正在访问。

无论如何,我对如何调试这个有两个建议。首先,而不是让OOM killer攻击需要很长时间,不可预测,并且可能会杀死重要的东西,请使用ulimit -v对进程大小进行限制。将其设置为合理的值,例如 1000000(大约 1GB),并努力将进程保持在该值以下。

其次,开始删除或注释掉除分配和释放内存的程序部分之外的所有内容。要么你会找到你的罪魁祸首,要么你会制作一个足够小的程序来完整地发布。

关于c++ - 利用大 vector 减少 C++ 程序的内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57744770/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com