Я думаю, что я превышаю доступную память для этого процесса. Может кто-нибудь взглянуть и проверить? - PullRequest
0 голосов
/ 21 июня 2019

Когда я не открываю файл (180 МБ), я не получаю сообщение об ошибке, но когда я открываю файл, я получаю ошибку сегментации 11. Я совершенно уверен, что я превышаю память для процесса. У кого-нибудь есть советы?

Я изменил параметры. Поэтому, если NUM_TRAIN = 10 вместо 60000, я не получаю ошибку сегментации. Когда NUM_TRAIN = 60000, но я не открываю файл, я также не получаю ошибку сегментации. Когда NUM_TRAIN = 60000 и я открываю файл, я получаю ошибку сегментации.

#include <stdio.h>
#define NUM_TRAIN 60000
#define IMAGE_SIZE 784
#define TRAIN_IMAGES "mnist_train.csv"
int main()
{
  int arr[NUM_TRAIN][IMAGE_SIZE];
  int arr2[NUM_TRAIN];
  FILE* fTrain = fopen(TRAIN_IMAGES, "r");
  return 0;
}

Я не ожидаю получить ошибку сегментации, но я, в частности, ошибка сегментации 11

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Я исправил свою проблему.По сути, я выделял слишком много статической памяти для массивов, поэтому я изменил код для динамического выделения памяти для кучи.Код выглядит следующим образом:

#include <stdio.h>
#include <stdlib.h>
#define NUM_TRAIN 60000
#define IMAGE_SIZE 784
#define TRAIN_IMAGES "mnist_train.csv"
int main()
{
  int** arr = (int**)malloc(sizeof(int*)*NUM_TRAIN);
  for (int i = 0; i < NUM_TRAIN; i++)
    arr[i] = (int*)malloc(sizeof(int)*IMAGE_SIZE);
  int* arr2 = (int*)malloc(sizeof(int)*NUM_TRAIN);
  FILE* fTrain = fopen(TRAIN_IMAGES, "r");
  return 0;
}
1 голос
/ 21 июня 2019

Вы создаете эти массивы в стеке.В отличие от кучи, она имеет строго ограниченную емкость и не может быть расширена.Пределы между 1-8MB являются общими.

Вместо этого выделите в куче:

int **arr = malloc(sizeof(int *) * NUM_TRAIN);

for (int i=0; i < NUM_TRAIN; ++i)
{
   arr[i] = malloc(sizeof(int) * IMAGE_SIZE);
}

Двумерный массив int на самом деле является массивом указателей на массивы * 1008.*.

Вы должны проверить на наличие ошибок во время звонящего на malloc() - здесь опущено.

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