内存不足杀死

时间:2020-05-27 16:32:22

标签: c matrix out-of-memory slurm

我在创建一个太大的矩阵时遇到了问题,该矩阵含糊不清(杀死内存不足)。我该如何解决该问题? 以下代码是有关分配矩阵的代码部分:

@GET("stats")
Call<Stat> getStats();

该值(行,列)是一个示例,因为我也可以使用更大的值 相反,以下代码是有关释放的代码的一部分:

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;

这是我的输出: Slurmstepd:错误:在步骤98584.0 cgroup中检测到1个oom-kill事件。您的某些进程可能已被cgroup内存不足处理程序杀死。 srun:错误:lab13p1:任务1:内存不足

2 个答案:

答案 0 :(得分:3)

  1. 将矩阵的声明更改为双指针(也许是错字):
double  **matrix;
  1. 您应该验证malloc函数的返回值,尤其是too big matrix

  2. 请勿强制转换malloc函数。 Do I cast the result of malloc?

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
    }
}

答案 1 :(得分:0)

看起来您在slurm上运行,因此可能在具有共享访问权限的集群上运行。

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

在文档中检查群集的内存限制。您还可以在scontrol show config的配置中看到一些限制。寻找诸如MaxMemPerCPUMaxMemPerNodeDefMemPerCPU之类的东西。

也许它仅使用最后一个为每个作业设置默认设置,并且您可以使用srun在启动命令(sbatch--mem-per-cpu=8G)中对其进行更改。

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