C 内存不足杀死
我在创建带有slurm cluster(内存不足)的过大矩阵时遇到问题。我怎样才能解决这个问题? 以下代码是关于分配矩阵的代码部分: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)
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
}
}