#python #python-3.x #shared-memory #mmap
#python #python-3.x #разделяемая память #mmap
Вопрос:
Я использую модуль mmap pythons для совместного использования памяти между набором процессов. Общие данные составляют сотни ГБ и не все сразу помещаются в память, при этом я хотел бы иметь возможность освободить некоторые области памяти после того, как я закончу с ними работать.
Насколько я понимаю, я могу освободить память в OSX с помощью следующего кода. Который, похоже, работает.
data_size = 10
data_start = 0
self.data = mmap.mmap(-1, 20)
self.data.seek(data_start)
self.data.write('0000000000')
self.data.madvise(mmap.MADV_FREE, data_start, data_size)
Однако MMADV_FREE, похоже, недоступен в redhat, и единственной подобной константой, которую я вижу доступной в redhat, является MMADV_REMOVE. Но всякий раз, когда я пытаюсь использовать эту константу, я получаю ошибку ОС.
# Let the OS know that these pages are no longer in use and can be freed
> self.data.madvise(mmap.MADV_REMOVE, data_start, data_size)
E OSError: [Errno 22] Invalid argument
Это правильный способ освободить память из mmap, выделенного в Python, или я что-то упускаю?
Версия Redhat: Red Hat Enterprise Linux Server версии 7.8 (Maipo)
Версия ядра:
#uname -r
4.14.35-2025.400.9.el7uek.x86_64
#uname -mrs
Linux 4.14.35-2025.400.9.el7uek.x86_64 x86_64
заголовки madvise
/* Advice to `madvise'. */
#ifdef __USE_BSD
# define MADV_NORMAL 0 /* No further special treatment. */
# define MADV_RANDOM 1 /* Expect random page references. */
# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
# define MADV_WILLNEED 3 /* Will need these pages. */
# define MADV_DONTNEED 4 /* Don't need these pages. */
# define MADV_REMOVE 9 /* Remove these pages and resources. */
# define MADV_DONTFORK 10 /* Do not inherit across fork. */
# define MADV_DOFORK 11 /* Do inherit across fork. */
# define MADV_MERGEABLE 12 /* KSM may merge identical pages. */
# define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages. */
# define MADV_HUGEPAGE 14 /* Worth backing with hugepages. */
# define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages. */
# define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
overrides the coredump filter bits. */
# define MADV_DODUMP 17 /* Clear the MADV_DONTDUMP flag. */
# define MADV_HWPOISON 100 /* Poison a page for testing. */
#endif
Версия Glibc
glibc-headers-2.17-307.0.1.el7.1.x86_64
Решение Итак, как выясняется, в Linux любые аргументы, передаваемые madvise
с MADV_REMOVE
помощью, должны быть выровнены по странице. Вот почему это выдавало мне ошибку. Выравнивание аргументов по страницам размером 4 КБ устранило проблему.
Комментарии:
1. На какой версии RHEL вы пытаетесь запустить это?
2. @HTF Не имеет значения, есть ли константы. Red Hat предоставляет ядро, и ядро также должно его поддерживать.
3. Можете ли вы использовать
MADV_DONTNEED
вместоMADV_FREE
?4. Вместо этого я попробовал MADV_DONTNEED и, к сожалению, получил аналогичную ошибку.
5. Я обновил сообщение версией redhat