Выделение массива очень большого размера - PullRequest
0 голосов
/ 08 января 2011

Как создать массив размером очень большой ?? Ну, я не могу создать массив размером INT_MAX .. как можно этого достичь.? 100100

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define SIZE 2147483647

int main() {    
   int *array;    
   unsigned int i;

   array = malloc(sizeof(int) * SIZE);    
   if(array == NULL)    {
      fprintf(stderr, "Could not allocate that much memory");
      return 1;    }

   for(i=0; i<1; i++)    {
      array[0] = 0;    
   }    

   free(array); 
}

Ответы [ 4 ]

5 голосов
/ 08 января 2011

Вы почти наверняка достигнете предела платформы. Если у вас есть только 32-битное адресное пространство, 4G - это то, на что вы можете надеяться. В действительности это будет намного меньше, поскольку часть адресного пространства будет занята другими вещами.

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

Один из способов решения этой проблемы - использовать нехватку памяти, такую ​​как диск, и вносить в память только то, что нужно.

Другими словами, разбить структуру данных на (например) порции по 1 млн. И обрабатывать их по 1 млн. За раз.

Существует множество алгоритмов кэширования, которые вы можете использовать для эффективного выполнения этой задачи в зависимости от моделей использования вашей структуры данных.

Например, для действительно последовательного доступа вы можете иметь один блок в памяти за раз. Для действительно произвольного доступа вам может потребоваться, чтобы в сценарии кэширования было несколько блоков одновременно - каждая структура в памяти хранит как 1 МБ данных, так и свое местоположение в памяти вне памяти, поэтому вы можете использовать алгоритмы LRU и запись грязных данных и т. д.

1 голос
/ 08 января 2011

Ваша первая проблема не само распределение, а, казалось бы, простое выражение sizeof(int) * SIZE. Результат этой операции равен 0x1FFFFFFFC, если int имеет 4 байта. Для этого необходимо 33 бита. Если ваша платформа имеет только 32-битный тип size_t, результат умножения оборачивается (size_t без знака) и дает вам 0xFFFFFFFC.

Если бы вы только что использовали 33-битное значение выше при вызове malloc, ваш компилятор, вероятно, сказал бы вам, что это число не представимо.

0 голосов
/ 08 января 2011

Пока что все пытаются ответить на ваш вопрос в соответствии с заданным вопросом, но я бы хотел использовать другой подход.По моему опыту, вам редко нужен массив типа / размера, который вы пытаетесь выделить.Часто есть другие способы сделать то, что вам нужно, без создания такой огромной структуры (разбирать массивы, стеки, очереди, карты).

Мне интересно, что вы хотите сделать с этим массивом.,,Бьюсь об заклад, вам это на самом деле не нужно, если мы поняли, какую проблему вы пытались решить.

С другой стороны, если это интеллектуальное упражнение (например, насколько велико я могу выделить), естьподходы к ответу на такие вопросы.

Если вы хотите играть.,,что вы на самом деле пытаетесь достичь?

0 голосов
/ 08 января 2011

Вы создаете массив размером не менее 4 ГБ. Вы уверены, что у вас так много свободной памяти?

...