首页 > 解决方案 > 分配大的多维向量会导致内存“过冲”

问题描述

在使用大型多维 std::vector 变量时,我观察到了意外的行为。特别是,当我分配一个大尺寸的 4 维向量时,可以看到,使用内存分析器,我的任务很快就会使用比变量所需的更多内存。

重现此行为的 MWE 如下:

#include <vector>
#include <iostream>

int main(int argc, char *argv[]){

    getchar();
    std::vector<std::vector<std::vector<std::vector<int64_t>>>> F(1, std::vector<std::vector<std::vector<int64_t>>>(15, std::vector<std::vector<int64_t>>(256, std::vector<int64_t>(100000, 0))));
    getchar();
}

下图显示了任务使用的内存。阵列的大小大约需要 3GB,但是内存使用量很快就会超过 6GB。请注意,向量的最后一个维度是最大的,这意味着向量类的内存开销相对较小。 内存配置文件

这已在 64 位系统上的 Manjaro 下观察到,使用 g++(gcc 版本 11.1.0 (GCC))编译。我使用psrecord来记录内存使用情况。有趣的是,我无法为低维向量重现相同的行为。即使我只删除第一个维度(大小为 1),我也无法在我的系统上重现此过冲。

有谁知道这是从哪里来的,或者是否可以避免(不使用大的一维向量)?这样做的主要问题是我的操作接近系统提供的最大内存,这意味着短暂的过冲会导致内存交换。

我会很高兴有任何想法和评论。提前致谢。

标签: c++memory

解决方案


除了解释问题根源的@amon、@NathanOliver 和@Top-Master 的评论之外,我将提供一个解决问题的代码示例。

#include <vector>
#include <iostream>

int main(int argc, char *argv[]){

    getchar();
    std::vector<std::vector<std::vector<std::vector<int64_t>>>> F(1, std::vector<std::vector<std::vector<int64_t>>>(15, std::vector<std::vector<int64_t>>(256)));
    for (int i=0; i<15; i++) for (int j=0; j<256; j++) F[0][i][j] = std::vector<int64_t>(100000, 0);
    getchar();
}

推荐阅读