C 内存不足杀死

C 内存不足杀死,c,matrix,out-of-memory,slurm,C,Matrix,Out Of Memory,Slurm,我在创建带有slurm cluster(内存不足)的过大矩阵时遇到问题。我怎样才能解决这个问题? 以下代码是关于分配矩阵的代码部分: double **matrix; int rows = 30000; int cols = 39996; matrix = (double**)malloc(sizeof(double*)*rows); for (int i = 0; i < rows; i++) matrix[i] = (double*)malloc(sizeof(double)

我在创建带有slurm cluster(内存不足)的过大矩阵时遇到问题。我怎样才能解决这个问题? 以下代码是关于分配矩阵的代码部分:

double  **matrix;
int rows = 30000;
int cols = 39996;
matrix = (double**)malloc(sizeof(double*)*rows);
for (int i = 0; i < rows; i++)
    matrix[i] = (double*)malloc(sizeof(double)*cols);

for(int i=0; i<rows; i++)
    for(int j=0; j<cols; j++)
        matrix[i][j] = 1;
双**矩阵;
int行=30000;
int cols=39996;
矩阵=(双**)malloc(sizeof(双*)*行);
对于(int i=0;i将矩阵的声明更改为双指针(可能是打字错误):
  • 您应该验证
    malloc
    函数的返回值,尤其是当
    矩阵太大时

  • 不要施放
    malloc
    函数

  • matrix=malloc(sizeof(double*)*行);
    if(!矩阵){
    //处理错误
    }
    对于(int i=0;i
    看起来您正在slurm上运行,因此可能在具有共享访问权限的集群上运行

    群集管理可能会限制每个作业和每个cpu的内存量

    检查集群文档中的内存限制。您还可以使用
    scoontrol show config
    在配置中看到一些限制。查找类似
    maxmemperpu
    MaxMemPerNode
    defmemperpu
    的内容

    也许它只是使用最后一个来设置每个作业的默认设置,您可以在启动命令(
    srun
    sbatch
    )中使用
    --mem per cpu=8G
    来更改它


    您还可以使用
    squee
    命令查看作业运行时使用的设置。查看
    -o
    选项的手册页,您可以在其中添加输出(
    -o%i%m
    显示作业ID及其可以运行的内存量).

    matrix
    必须是一个双指针,打字错误?这是一段很重的代码,但从第一个演员开始就没有什么问题,最坏情况下应该是
    (双**)
    充其量不包含任何内容,并且包含
    stdlib.h
    。似乎内存不足。您正在尝试创建一个包含大约12亿个双倍的矩阵(行指针在噪声中丢失)。这需要大约10 GiB的堆内存。你有那么多可用内存吗?一台16 GiB的机器不是很少见,但8 GiB的机器可能更常见。啊,讨厌。禁用OOM杀手,禁用内存过度使用,确保磁盘上有足够的交换空间,并且永远不要处理任意杀死的东西再次处理。对不起,我复制我的代码是错误的,声明是正确的。我添加了你的控制指令,但我收到了相同的输出。@Snake91第一个
    malloc
    matrix=(double)malloc(sizeof(double*)*行);
    )是打字错误的,不是吗?@Hitokiri通常将
    malloc
    转换为无用的结果,但带有
    (float)的结果
    可以修改地址,事实上,奇怪的是编译器没有产生错误,所有这些都可能是你可以在回答中坚持更多关于潜在破坏的内容cast@bruno非常感谢您的评论,这对我也很有帮助。但是我们必须等待OP来验证
    矩阵
    是否有输入错误(我用上面的评论问他)。如果没有,我会在回答中更新你的评论。是的,对不起,是另一个输入错误,我有一个正确的代码,但内存不足。当矩阵太大时,我无法运行模拟。是否有其他方法解决此问题?
    
    for (int i = 0; i < 30000; i++)
        free(matrix[i]);
    free(matrix);
    
    double  **matrix;
    
    matrix = malloc(sizeof(double*)*rows);
    if(!matrix) {
       // handle the error
    }
    
    for (int i = 0; i < rows; i++) {
        matrix[i] = malloc(sizeof(double)*cols);
        if(!matrix[i]) {
           // handle the error
        }
    }