#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
опцией он этого не сделает. С помощью aMADV_DONT_NEED
ОС освободит (технически будет бесплатно освобождать) все страницы, которые он хранит в памяти как кэш