C как освободить саб память? - PullRequest
0 голосов
/ 13 ноября 2018

Я выделяю большую память, char* test= malloc(10000000);, затем помещаю значение в эту память и выполняю некоторую работу для каждого значения.

Я хочу, чтобы каждый индекс 1000, я хотел освободить всю память до тех пор, пока он не будет.

Например.

for(long i=0; i<10000000;i++)
   DoSomeWork(test[i]);
   if(i%1000==0)
       releaseMemory(i-1000,i);

Как мне это сделать в c?

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

Я хочу, чтобы каждая 1000 работ бесплатно, все 1000 обратно

Я должен выделить всю память в начале программы.

1 Ответ

0 голосов
/ 13 ноября 2018

То, что вы хотите, может быть достигнуто путем выделения программы меньшими порциями.

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

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

Позвольте мне немного улучшить здесь:

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

#define CHUNKSIZE 10000
#define ENTRYSIZE 8
#define NUM_CHUNKS 1000

void test(void)
{
    void** outer_array = malloc(NUM_CHUNKS * sizeof(void*))
    for (int i = 0; i < NUM_CHUNKS; i++) {
        void * chunk = malloc(CHUNKSIZE * ENTRYSIZE);
        outer_array[NUM_CHUNKS - 1 - i] = chunk;
        // allocate them in reverse order
    }

    // now, set item #123456
    size_t item_index = 123456;
    // TODO check if the index is below the maximum
    size_t chunk_index = item_index / CHUNKSIZE;
    size_t index_into_chunk = item_index % CHUNKSIZE;
    void * item_address = &outer_array[chunk_index][index_into_chunk * ENTRY_SIZE];

    // after having processed one chunk, you can free it:
    free(outer_array[0]);
    outer_array[0] = NULL;
}

Есть (примерно) две возможности, как программа может увеличить кучу для выделения памяти:

  1. Он может получить совершенно новый блок памяти от ОС, независимый от «основного адресного пространства». Затем он может использовать его для распределения и вернуть его ОС, как только он станет free() d. Это происходит в некоторых распределителях, если размер выделения превышает определенный порог.
  2. Может улучшить адресное пространство программы. Затем новая память добавляется в конце. После free() последнего блока памяти адресное пространство программы может быть снова уменьшено. Это происходит в некоторых распределителях, если размер выделения ниже определенного порога.

Таким образом, объем памяти вашей программы со временем уменьшается.

...