Убить память - PullRequest
       55

Убить память

1 голос
/ 27 мая 2020

У меня проблема с созданием слишком большой матрицы с slurm cluster (Out of memory убит). Как я могу решить проблему? Следующий код является частью кода, относящегося к матрице распределения:

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;

Это значение (строки, столбцы) является примером, потому что я также могу иметь большее значение. Вместо этого следующий код является частью кода о Deallocation:

for (int i = 0; i < 30000; i++)
    free(matrix[i]);
free(matrix);

Это мой вывод: Slurmstepd: error: обнаружено 1 событие (я) oom-kill на этапе 98584.0 cgroup. Некоторые из ваших процессов могли быть убиты обработчиком нехватки памяти cgroup. srun: ошибка: lab13p1: задача 1: недостаточно памяти

1 Ответ

3 голосов
/ 27 мая 2020
  1. заменить объявление матрицы на двойной указатель (возможно, это опечатка):
double  **matrix;

Вы должны проверить возвращаемое значение функции malloc, особенно с too big matrix.

Не приводить malloc функцию. Привести ли результат mallo c?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...