Как я могу хранить 1 000 000 000 элементов в массиве? - PullRequest
0 голосов
/ 01 марта 2019

Я делаю упражнение по просьбе моего учителя.Работа должна оценить большое количество значений (до 1 000 000 000, если быть точным), и программа выдает ошибку, когда я пытаюсь добавить значения в массив PosFez.

Я думаю, что у меня естьиспользовать malloc, но я изучил этот материал некоторое время назад, и я не помню, как это сделать.Я также думаю, что попытка оценить значения напрямую работала бы, но я мог думать, что мне нужно было также сохранить данные

#include <stdio.h>

int n,m,q;

int main(){
    scanf("%d %d",&n,&m);

    int PosFez[m];

    for(int i = 0; i < m; i++){
        scanf("%d",&PosFez[i]);
    }

    int Postos[n];
    for(int i = 0; i < n; i++){ 
        Postos[i] = 0;
    }


    scanf("%d",&q);

    int p[q];

    for(int i = 0; i<q;i++){
        scanf("%d",&p[i]);
    }

    for(int i = 0; i < m; i++){
        for(int j = 0; j < PosFez[i]; j++){
            Postos[j]++;
        }
    }   


    for(int i=0; i<q;i++){  
        printf("%d\n",Postos[PosFez[i]-1]);
    }
}

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Для начала давайте сделаем быстрый расчет. Предполагая, что int занимает 4 байта (32 бита) на вашем компьютере, вам потребуется около 3,7 ГБ ОЗУ только для хранения данных.Поэтому, если у вас всего 4 ГБ памяти, вам, скорее всего, не хватит, поскольку ОС и другие программы уже занимают значительную ее часть.

Во-вторых, как упоминали другие пользователи, этот объем данных не будет соответствоватьв стеке.Вы должны выделить память, используя, например, malloc. Этот сайт должен помочь вам научиться.

Если у вас действительно так много значений, я думаю, данные предоставлены вам в виде файла.Вместо загрузки всего в память просто проанализируйте файл и оцените его шаг за шагом.В противном случае вы всегда можете записать данные в файл и затем перейти оттуда.

0 голосов
/ 01 марта 2019

Работа должна оценить большое количество значений (точнее, до 1 000 000 000), и программа выдает ошибку, когда я пытаюсь добавить значения в массив PosFez

 int PosFez[m];

вы не можете иметь массив 1000 000 000 int в стеке, размер стека ограничен (обычно несколько мегабайт, см. ulimit в Linux / Unix), выделитемассив в голове, используя, например, malloc для этого

Если вы не уверены, что вам нужен такой большой массив, вы можете выделить меньше, и каждый раз нужно использовать realloc чтобы увеличить его размер

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