calloc возвращает NULL / ENOMEM для большого количества блоков

Для универа, который я использую CRFSuite.
Это программное обеспечение в значительной степени опирается на динамическое распределение памяти с использованием calloc,

Когда я передаю большие наборы данных, программа падает, и отладка показала, что calloc не может выделить достаточно памяти.
Возвращается NULL а также errno установлен в ENOMEM,

Это код, который не работает:

int crf1dc_set_num_items(crf1d_context_t* ctx, int T)
{
const int L = ctx->num_labels;

ctx->num_items = T;

if (ctx->cap_items < T) {
free(ctx->backward_edge);
free(ctx->mexp_state);
_aligned_free(ctx->exp_state);
free(ctx->scale_factor);
free(ctx->row);
free(ctx->beta_score);
free(ctx->alpha_score);

// The folllowing allocation fails:

ctx->alpha_score = (floatval_t*)calloc(T * L, sizeof(floatval_t));
if (ctx->alpha_score == NULL) return CRFSUITEERR_OUTOFMEMORY;

// [..snipped..]
}

// [..snipped..]
}

В качестве конкретного примера, это терпит неудачу для T * L = 224608388, т.е.

ctx->alpha_score = (floatval_t*)calloc(224608388, sizeof(floatval_t));

А также sizeof(floatval_t) 8, согласно отладчику.
Да, это почти 2 ГБ памяти, но давай …
Это терпит неудачу, независимо от того, скомпилирован ли код для 32 или 64 бит.
Это также терпит неудачу для меньшего количества блоков.

Тем не менее, это удастся, если я поставлю это в первую очередь, например, так:

int main(int argc, char *argv[])
{
floatval_t* foo = (floatval_t*)calloc(224608388, sizeof(floatval_t));
if (foo != NULL)
{
free(foo);
}

// [..actual code snipped..]
}

Вероятно, лучшим способом исправить это было бы рефакторинг кода, чтобы он больше не зависел от непрерывной памяти, но я никак не мог это сделать. (Помимо того, что я недостаточно умен, чтобы понимать все детали, код вообще не документирован, есть только загадочные имена переменных, и у проекта есть очень странный способ реализации методов … с подчеркиванием self Параметры …)

Итак, есть ли способ, которым я мог бы избавиться от этой проблемы?

Моя система представляет собой компьютер с Windows 8.1 Enterprise x64 с 8 ГБ оперативной памяти.
Я мог бы также попытаться запустить его на другой машине, но я скептически отношусь, если это действительно поможет … Кажется, проблема в другом месте …

Обычно я работаю на C #, а не на C / C ++ … (хотя я знаю самые основы).

Спасибо!

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector