КОНТЕКСТ :

Я бегаю на старом ноуте. У меня только 128Mo свободной оперативной памяти на 512Mo всего. Нет денег, чтобы купить еще барана.

Я использую mmap, чтобы помочь мне обойти эту проблему, и он работает достаточно хорошо. Код C. 64-битная версия Debian.

ПРОБЛЕМА:

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

Я читал, что madvise может помочь, особенно вариант MADV_SEQUENTIAL.

Но я не совсем понимаю всю картину.

НЕОБХОДИМОСТЬ:

Чтобы иметь возможность освободить выделенную память mmaped после чтения региона, чтобы он не заполнял всю мою оперативную память большими файлами. Я не буду читать его в ближайшее время, так что для меня это мусор. Бессмысленно держать его в таране.

Обновление: я не закончил с файлом, поэтому не хочу звонить munmap. У меня есть другие дела, но в других регионах. Случайное чтение.

1
Larry 15 Май 2014 в 16:17

2 ответа

Лучший ответ

Для произвольного доступа для чтения / записи к редактируемому файлу mmap() MADV_SEQUENTIAL, вероятно, не очень полезен (и может фактически вызвать нежелательное поведение). В этом случае лучше выбрать MADV_RANDOM или MADV_DONTNEED. Однако имейте в виду, что ядро ​​может игнорировать любой madvise() - хотя, насколько я понимаю, Linux в настоящее время этого не делает, поскольку он имеет тенденцию рассматривать madvise() больше как команду, чем совет ...

Другой вариант - mmap() только выбранные разделы файла по мере необходимости и munmap() их, когда вы закончите с ними, возможно, поддерживая пул небольшого количества текущих активных сопоставлений (т. Е. Сопоставление большего количества если необходимо, сразу более чем в одном регионе, но все же с ограничением).

2
twalberg 15 Май 2014 в 15:26

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

Не уверен, в чем вопрос, если вы знаете о mmap(), то наверняка знаете о munmap() тоже? Это прямо на той же странице руководства.

0
unwind 15 Май 2014 в 12:22