我在创建一个太大的矩阵时遇到了问题,该矩阵含糊不清(杀死内存不足)。我该如何解决该问题? 以下代码是有关分配矩阵的代码部分:
@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:内存不足
答案 0 :(得分:3)
double **matrix;
您应该验证malloc
函数的返回值,尤其是too big matrix
。
请勿强制转换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
的配置中看到一些限制。寻找诸如MaxMemPerCPU
,MaxMemPerNode
,DefMemPerCPU
之类的东西。
也许它仅使用最后一个为每个作业设置默认设置,并且您可以使用srun
在启动命令(sbatch
,--mem-per-cpu=8G
)中对其进行更改。
您还可以使用squeue
命令查看您的作业正在使用哪些设置。在手册页上查看-o
选项,您可以在其中添加输出(-o %i %m
显示作业ID及其可以运行的内存量。)