Как я могу ограничить объем данных, заблокированных в памяти при использовании mmap?

#mmap

#mmap

Вопрос:

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

Я пробовал madvise(fd, range, MADV_RANDOM) и madvise(fd, range, MADV_DONT_NEED) для каждого доступа, но это не работает. Я также попытался setrlimit.RLIMIT_MEMLOCK ограничить объем памяти, заблокированной в оперативной памяти.

Комментарии:

1. Я думаю, вы делаете что-то не так. Вы читаете или записываете в файл? Вы действительно используете «реальный» файл в качестве резервной копии mmap? Если вы записываете в файл, вы используете MAP_SHARED , верно?

2. Я делал что-то не так. Переполнение памяти было вызвано последовательным сканированием очень большого файла mmap, а не случайным доступом к файлу. Извините за путаницу. Мое текущее решение заключается в том, чтобы одновременно отображать только часть файла. Я думаю, это рекомендуемый способ использования mmap. Я должен создать файл mmap объемом 500 ГБ за один раз.

3. Даже в 64-битной системе «неограниченный» mmap не очень хорош 🙂

4. :). Итак, я полагаю, что нет способа освободить память, удерживаемую mmap ?. Что делают madvise(MADV_RANDOM) и MADV_DONT_NEED ?.

5. Вы должны освободить память mmap munmap , иначе вы израсходуете свое виртуальное адресное пространство. Использование MADV_RANDOM зависит от того, как обычно ОС кэширует доступ к диску. Если вы читаете 1 КБ данных, ОС часто считывает следующий КБ данных, потому что думает, что вы будете обращаться к файлу последовательно. С MADV_RANDOM опцией он этого не сделает. С помощью a MADV_DONT_NEED ОС освободит (технически будет бесплатно освобождать) все страницы, которые он хранит в памяти как кэш